Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐
转载请注明出处:项目源码(打赏5积分请点这边):项目源码(免积分下载请点这边):觉得博文有用,请点赞,请留言,请关注,谢谢!~实现功能:歌曲下载完成后通知主界面更新本地音乐除了下面说明的一个问题,还有一些BUG有待修复,后续博文将会继续更新//DownloadDialogFragment回传的是否下载成功的回传值
public void downloadSuccessListener(String isDownloadSuccess) {
System.out.println(&MainActivity.downloadSuccessListener = & + isDownloadSuccess);
if (isDownloadSuccess.length() & 0){
//Toast.makeText(MainActivity.this, &DownloadDialogFragment.下载成功.回传给.MainActivity = & + isDownloadSuccess, Toast.LENGTH_SHORT).show();
//问题:下载完成后,确实通知媒体库更新了,但是马上初始化数据,可能媒体库还没有更新
//临时解决:在ActionBar上,添加一个刷新按钮
//永久解决:通过mp3Infos.size()的改变,来判断媒体库已经更新
//更新本地音乐列表
myMusicListFragment.loadData();//初始化数据
myMusicListFragment.newInstance();//重新实例化一下本地音乐Fragment,加载新的数据
}实现效果如图:因为,没有自己的服务器,所以网络音乐所有相关功能(包含搜索音乐、下载音乐、下载歌词)均无法保证时效性,建议,尽快下载和练习;如果你下载时候,已经因为我采集的服务器更改规则,请给我留言,如果可以解决,我将在有空的时候献上新的源码。(最新的,请下载最后一个,本博文对应版本2.5;如果需要逐步实现的过程,请下载所有)(有兴趣可以看看版本2.4,有时候可以更新本地音乐列表,但是更新后,播放不了本地音乐,2.5在Playservice也有一些改动,本篇博文没有体现,有兴趣可以自己挖掘一下)实现代码如下:DownloadDialogFragment如下:package com.iwanghang.
import android.app.AlertD
import android.app.D
import android.content.I
import android.net.U
import android.os.E
import android.provider.MediaS
import android.support.v4.app.DialogF
import android.content.C
import android.content.DialogI
import android.os.B
import android.widget.T
import com.iwanghang.drmplayer.adapter.MyMusicListA
import com.iwanghang.drmplayer.utils.C
import com.iwanghang.drmplayer.utils.DownloadU
import com.iwanghang.drmplayer.utils.MediaU
import com.iwanghang.drmplayer.vo.Mp3I
import com.iwanghang.drmplayer.vo.SearchR
import java.io.F
import java.util.ArrayL
* Created by iwanghang on 16/5/3.
* DownloadDialogFargment
public class DownloadDialogFragment extends DialogFragment {
private MyMusicListFragment myMusicListF
private ArrayList&Mp3Info& mp3I
private MyMusicListAdapter myMusicListA
private SearchResult searchR//当前要下载的歌曲对象
private MainActivity mainA
public static DownloadDialogFragment newInstance(SearchResult searchResult){
DownloadDialogFragment downloadDialogFragment = new DownloadDialogFragment();
downloadDialogFragment.searchResult = searchR
return downloadDialogF
private String[]
public void onAttach(Context context) {
super.onAttach(context);
mainActivity = (MainActivity) getActivity();
//items = new String[]{&下载&,&取消&};
items = new String[]{getString(R.string.download),getString(R.string.cancel)};
// 回调接口
//public interface DownloadSelectListener { // 是否选择(点击)下载.***.按钮回调接口
void downloadSelectListener(int isDownload); // 回传一个int,是否选择(点击)下载按钮 ; 回传0,表示下载;回传1,表示取消
//创建对话框的事件方法
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity);
builder.setCancelable(true);//返回键可以取消
builder.setItems(items,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
switch (which) {
//执行下载
downloadMusic();
case 1://取消
dialog.dismiss();
//DownloadSelectListener listener = (DownloadSelectListener) getActivity(); // 回调接口
//listener.downloadSelectListener(which);//回传0,表示下载;回传1,表示取消
return builder.show();
// 回调接口
public interface DownloadSuccessListener { // 下载是否成功.***.按钮回调接口
void downloadSuccessListener(String isDownloadSuccess); // 回传一个字符串
//下载音乐
private void downloadMusic() {
Toast.makeText(mainActivity, &正在下载:& + searchResult.getMusicName(), Toast.LENGTH_LONG).show();
DownloadUtils.getsInstance().setListener(new DownloadUtils.OnDownloadListener() {
public void onDowload(String mp3Url) { //下载成功
Toast.makeText(mainActivity, &下载成功&, Toast.LENGTH_SHORT).show();
System.out.println(&DownloadDialogFragment.downloadMusic @ = & + Environment.getExternalStorageDirectory()+Constant.DIR_MUSIC + &/& + mp3Url);
//更新媒体库
scanFile(mainActivity,Environment.getExternalStorageDirectory()+Constant.DIR_MUSIC + &/& + mp3Url);
//更新 本地音乐列表 , 这个功能放在MainActivity实现
//DownloadSuccessListener listener = (DownloadSuccessListener) getActivity(); // 空指针异常,因为Fragment已经销毁,所以getActivity()==null,需要使用下面的写法
DownloadSuccessListener listener = mainA // 回调接口
System.out.println(&DownloadDialogFragment.downloadMusic.listener = & + listener);
listener.downloadSuccessListener(mp3Url); // 回传一个字符串 ,回传什么都行 ,只是告诉MainActivity ,已经下载成功了新的歌曲
public void onFailed(String error) { //下载失败
Toast.makeText(mainActivity, error, Toast.LENGTH_SHORT).show();
}).download(searchResult);
* 通知媒体库更新文件
* @param context
* @param filePath 文件全路径
public void scanFile(Context context, String filePath) {
Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
scanIntent.setData(Uri.fromFile(new File(filePath)));
context.sendBroadcast(scanIntent);
* 更新本地音乐列表
//private void loadDataAndChangeUI() {
if(myMusicListFragment==null){
myMusicListFragment = MyMusicListFragment.newInstance();
//mp3Infos = MediaUtils.getMp3Infos(mainActivity);
//myMusicListAdapter = new MyMusicListAdapter(mainActivity,mp3Infos);
//listView_my_music.setAdapter(myMusicListAdapter);
myMusicListFragment.loadData();//初始化数据
myMusicListFragment.changeUIStatusOnPlay(0);
}MainActivity如下:package com.iwanghang.
import android.content.I
import android.content.SharedP
import android.graphics.BitmapF
import android.graphics.BitmapFactory.O
import android.graphics.C
import android.graphics.drawable.ColorD
import android.graphics.drawable.D
import android.graphics.drawable.LayerD
import android.graphics.drawable.TransitionD
import android.os.B
import android.os.B
import android.os.H
import android.support.v4.app.F
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentPagerA
import android.support.v4.view.ViewP
import android.util.TypedV
import android.view.M
import android.view.MenuI
import android.view.V
import android.widget.ListV
import android.widget.T
import com.astuetz.PagerSlidingTabS
import com.astuetz.viewpager.extensions.sample.QuickContactF
import com.iwanghang.drmplayer.utils.MediaU
import com.iwanghang.drmplayer.vo.Mp3I
import java.nio.charset.CoderMalfunctionE
import java.util.ArrayL
public class MainActivity extends BaseActivity implements DownloadDialogFragment.DownloadSuccessListener {
// private final Handler handler = new Handler();
private PagerSlidingTabS
private ViewP
private MyPagerA
public DRMPlayerA//取出全局对象 方便调用
// private Drawable oldBackground =
// private int currentColor = 0xFFC74B46;
private MyMusicListFragment myMusicListF
private NetMusicListFragment netMusicListF
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//取出全局对象 方便调用
app = (DRMPlayerApp) getApplication();
setContentView(R.layout.activity_main);
tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
pager = (ViewPager) findViewById(R.id.pager);
adapter = new MyPagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
android TypedValue.applyDimension()的作用
这个方法是转变为标准尺寸的一个函数,例如
int size =(int)TypedValue.PLEX_UNIT_SP, 20,context.getResources().getDisplayMetrics());
这里COMPLEX_UNIT_SP是单位,20是数值,也就是20sp。
final int pageMargin = (int) TypedValue.PLEX_UNIT_DIP, 4, getResources()
.getDisplayMetrics());
pager.setPageMargin(pageMargin);
tabs.setViewPager(pager);
//修改主界面颜色,稍后修复功能,暂时使用默认颜色
//changeColor(currentColor);
//绑定服务
//服务在加载SplashActivity(欢迎页面)的时候,已经启动
//bindPlayService();
//这里,我在MyMusicListFragment里面绑定,而没有在MainActivity里绑定
public void publish(int progress) {
//更新进度条
public void change(int position) {
//更新歌曲位置.按钮的状态等信息
* 本地音乐的播放UI实际上在MyMusicListFragment中,所以要
* 先在MyMusicListFragmen中,写入public void changeUIStatus(int position){}
* 然后,传参过去
if (pager.getCurrentItem()==0){//如果页面等于0,则说明选中的是第一个页面,我的音乐页面
System.out.println(&MainActivity.change.pager.getCurrentItem()==0&);
myMusicListFragment.loadData();//初始化数据
myMusicListFragment.changeUIStatusOnPlay(position);
}else if (pager.getCurrentItem()==1){
System.out.println(&MainActivity.change.pager.getCurrentItem()==1&);
//DownloadDialogFragment回传的是否点击下载按钮的回传值
//@Override
//public void downloadSelectListener(int isDownload) {
// if (isDownload == 0){
Toast.makeText(MainActivity.this, &DownloadDialogFragment.下载点击事件.回传给.MainActivity&, Toast.LENGTH_SHORT).show();
// }else if (isDownload == 1){
Toast.makeText(MainActivity.this, &DownloadDialogFragment.取消点击事件.回传给.MainActivity&, Toast.LENGTH_SHORT).show();
//MyMusicListFragment.newInstance();
//DownloadDialogFragment回传的是否下载成功的回传值
public void downloadSuccessListener(String isDownloadSuccess) {
System.out.println(&MainActivity.downloadSuccessListener = & + isDownloadSuccess);
if (isDownloadSuccess.length() & 0){
//Toast.makeText(MainActivity.this, &DownloadDialogFragment.下载成功.回传给.MainActivity = & + isDownloadSuccess, Toast.LENGTH_SHORT).show();
//问题:下载完成后,确实通知媒体库更新了,但是马上初始化数据,可能媒体库还没有更新
//临时解决:在ActionBar上,添加一个刷新按钮
//永久解决:通过mp3Infos.size()的改变,来判断媒体库已经更新
//更新本地音乐列表
myMusicListFragment.loadData();//初始化数据
myMusicListFragment.newInstance();//重新实例化一下本地音乐Fragment,加载新的数据
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
// @Override
// public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_contact:
QuickContactFragment dialog = new QuickContactFragment();
dialog.show(getSupportFragmentManager(), &QuickContactFragment&);
return super.onOptionsItemSelected(item);
// private void changeColor(int newColor) {
tabs.setIndicatorColor(newColor);
// change ActionBar color just if an ActionBar is available
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.HONEYCOMB) {
Drawable colorDrawable = new ColorDrawable(newColor);
Drawable bottomDrawable = getResources().getDrawable(R.drawable.actionbar_bottom);
LayerDrawable ld = new LayerDrawable(new Drawable[] { colorDrawable, bottomDrawable });
if (oldBackground == null) {
if (Build.VERSION.SDK_INT & Build.VERSION_CODES.JELLY_BEAN_MR1) {
ld.setCallback(drawableCallback);
getActionBar().setBackgroundDrawable(ld);
TransitionDrawable td = new TransitionDrawable(new Drawable[] { oldBackground, ld });
// workaround for broken ActionBarContainer drawable handling on
// pre-API 17 builds
// /android/platform_frameworks_base/commit/a7cc06d82ea59bdb4e4
if (Build.VERSION.SDK_INT & Build.VERSION_CODES.JELLY_BEAN_MR1) {
td.setCallback(drawableCallback);
getActionBar().setBackgroundDrawable(td);
td.startTransition(200);
oldBackground =
// /questions//actionbar-setbackgrounddrawable-nulling-background-from-thread-handler
getActionBar().setDisplayShowTitleEnabled(false);
getActionBar().setDisplayShowTitleEnabled(true);
currentColor = newC
// public void onColorClicked(View v) {
int color = Color.parseColor(v.getTag().toString());
changeColor(color);
// @Override
// protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(¤tColor&, currentColor);
// @Override
// protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
currentColor = savedInstanceState.getInt(¤tColor&);
changeColor(currentColor);
// private Drawable.Callback drawableCallback = new Drawable.Callback() {
public void invalidateDrawable(Drawable who) {
getActionBar().setBackgroundDrawable(who);
public void scheduleDrawable(Drawable who, Runnable what, long when) {
handler.postAtTime(what, when);
public void unscheduleDrawable(Drawable who, Runnable what) {
handler.removeCallbacks(what);
public class MyPagerAdapter extends FragmentPagerAdapter {
private final String[] TITLES = { &本地音乐&, &网络音乐&};
public MyPagerAdapter(FragmentManager fm) {
super(fm);
public CharSequence getPageTitle(int position) {
return TITLES[position];
public int getCount() {
return TITLES.
public Fragment getItem(int position) {
//return SuperAwesomeCardFragment.newInstance(position);
if(position==0){
System.out.println(&MainActivity.MyPagerAdapter.position==0&);
if(myMusicListFragment==null){
myMusicListFragment = MyMusicListFragment.newInstance();
return myMusicListF
}else if (position == 1){
System.out.println(&MainActivity.MyPagerAdapter.position==1&);
if(netMusicListFragment==null){
netMusicListFragment = NetMusicListFragment.newInstance();
return netMusicListF
//return MyMusicListFragment.newInstance();
public boolean onCreateOptionsMenu(Menu menu) {//填充菜单
getMenuInflater().inflate(R.menu.main_menu,menu);
public boolean onOptionsItemSelected(MenuItem item){//菜单中事件
switch (item.getItemId()){
case R.id.newMyMusic:
myMusicListFragment.loadData();//初始化数据
myMusicListFragment.newInstance();//重新实例化一下本地音乐Fragment,加载新的数据
System.out.println(&刷新&);
case R.id.ilove:
Intent intent = new Intent(this,MyLoveMusicActivity.class);
startActivity(intent);
System.out.println(&我的收藏&);
case R.id.near_play:
Intent intent2 = new Intent(this,MyRecordMusicActivity.class);
startActivity(intent2);
System.out.println(&最近播放&);
protected void onDestroy() {
super.onDestroy();
//保存当前播放的一些状态值
DRMPlayerApp app = (DRMPlayerApp) getApplication();
SharedPreferences.Editor editor = app.sp.edit();
//保存 当前正在播放的歌曲的位置
editor.putInt(¤tPosition&,playService.getCurrentPosition());
//保存 播放模式
editor.putInt(&play_mode&,playService.getPlay_mode());
//保存 提交
//创建DRMPlayerApp继承Application,同时需要在把AndroidManiFest中的public换成DRMPlayerApp
//在DRMPlayerApp的onCreate中 实例化 SharedPreferences
//在MainActivity的onDestroy中 保存状态值
//在PlayService的onCreate中 恢复状态值
}欢迎移动开发爱好者交流沈阳或周边城市公司有意开发Android,请与我联系联系方式微信:iwanghangQQ:邮箱:转载请注明出处:项目源码(打赏5积分请点这边):项目源码(免积分下载请点这边)::觉得博文有用,请点赞,请留言,请关注,谢谢!~
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?请问在哪里查看本地某首歌曲详情?比如码率?【网易云音乐吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:108,231贴子:
请问在哪里查看本地某首歌曲详情?比如码率?收藏
找了很久都没找到,比如要查看本地某首歌曲的码率和大小等资料详情?在哪里看啊?
玩转微信营销-扫一扫添加越邦***,扫码有奖哦!
资源管理器就可以看啊
登录百度帐号推荐应用