android音乐播放器实现(Service+BroadcastReceiver+Notification)
2016-04-15 10:54
423 查看
public interface IMusic { public void moveon();//继续 public void pause();//暂停 public void stop();//停止 public void nextSong();//下一曲 public void lastSong();//上一曲 }
定义Application类,用于传递全局变量:
public class Mp3Application extends Application { public List<Song> songsList;//当前播放列表 public int songItemPos;//当前播放音乐在列表中的位置 public NotificationManager notManager; public IMusic music; } 定义Service类,用于控制音乐播放: public class PlayerService extends Service { private MediaPlayer mp; private Mp3Application application; private List<Song> songs; private int songItemPos; @Override public void onCreate() { super.onCreate(); application = (Mp3Application) getApplication(); songs = application.songsList; } @Override public IBinder onBind(Intent intent) { play(songItemPos); return new MusicListener(); } public void play(int position) { <span style="white-space:pre"> </span>//传入播放位置在列表中的边界 if(position>=0){ position=position % application.songsList.size(); } else{ position = application.songsList.size()+ position; } application.songItemPos = position;//在全局变量中标记当前播放位置 Song currentSong = songs.get(position);//获取当前播放音乐 Uri musicTableForSD = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Uri uri = Uri.withAppendedPath(musicTableForSD, "/" + currentSong.getId());//初始化mp对象 mp = MediaPlayer.create(this, uri); System.out.println(currentSong.getName()); try { mp.start(); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onUnbind(Intent intent) { mp.stop(); mp.release(); mp = null; return super.onUnbind(intent); } @Override public void onDestroy() { super.onDestroy(); } <span style="white-space:pre"> </span>//实现IMusic接口,用于接收播放信息 private class MusicListener extends Binder implements IMusic { @Override public void moveon() { if (mp != null) { mp.start(); } } @Override public void pause() { if (mp != null) { mp.pause(); } } @Override public void stop() { if (mp != null) { mp.stop(); mp.release(); mp = null; } } @Override public void nextSong() { if (mp != null) { mp.stop(); play(++application.songItemPos); } } @Override public void lastSong() { if (mp != null) { mp.stop(); play(--application.songItemPos); } } } }
初始化Notification,该部分主要在Activity中完成:
Notification的布局效果(即contentView):
public class MainActivity extends Activity { ..... private RemoteViews contentView; private Notification notification; private Mp3Application application; private IMusic music; ..... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ...... // 初始化通知栏播放控件 initNotificationBar(); ...... } public void initNotificationBar() { notification = new Notification(); //初始化通知 notification.icon = R.drawable.ic_launcher; contentView = new RemoteViews(getPackageName(), R.layout.notification_control); notification.contentView = contentView; Intent intentPlay = new Intent("play");//新建意图,并设置action标记为"play",用于接收广播时过滤意图信息 PendingIntent pIntentPlay = PendingIntent.getBroadcast(this, 0, intentPlay, 0); contentView.setOnClickPendingIntent(R.id.bt_notic_play, pIntentPlay);//为play控件注册事件 Intent intentPause = new Intent("pause"); PendingIntent pIntentPause = PendingIntent.getBroadcast(this, 0, intentPause, 0); contentView.setOnClickPendingIntent(R.id.bt_notic_pause, pIntentPause); Intent intentNext = new Intent("next"); PendingIntent pIntentNext = PendingIntent.getBroadcast(this, 0, intentNext, 0); contentView.setOnClickPendingIntent(R.id.bt_notic_next, pIntentNext); Intent intentLast = new Intent("last"); PendingIntent pIntentLast = PendingIntent.getBroadcast(this, 0, intentLast, 0); contentView.setOnClickPendingIntent(R.id.bt_notic_last, pIntentLast); Intent intentCancel = new Intent("cancel"); PendingIntent pIntentCancel = PendingIntent.getBroadcast(this, 0, intentCancel, 0); contentView .setOnClickPendingIntent(R.id.bt_notic_cancel, pIntentCancel); notification.flags = notification.FLAG_NO_CLEAR;//设置通知点击或滑动时不被清除 application.notManager.notify(Const.NOTI_CTRL_ID, notification);//开启通知 } } 定义BroadcastReceiver类,用于接收来自Notification的广播并控制音乐播放: public class Mp3Receiver extends BroadcastReceiver { private Mp3Application application; private IMusic music; @Override public void onReceive(Context context, Intent intent) { application = (Mp3Application) context.getApplicationContext(); String ctrl_code = intent.getAction();//获取action标记,用户区分点击事件 music = application.music;//获取全局播放控制对象,该对象已在Activity中初始化 if (music != null) { if ("play".equals(ctrl_code)) { music.moveon(); System.out.println("play"); } else if ("pause".equals(ctrl_code)) { music.pause(); System.out.println("pause"); } else if ("next".equals(ctrl_code)) { music.nextSong(); System.out.println("next"); } else if ("last".equals(ctrl_code)) { music.lastSong(); System.out.println("last"); } } if ("cancel".equals(ctrl_code)) { application.notManager.cancel(Const.NOTI_CTRL_ID); System.exit(0); } } } 最后别忘了在清单文件中声明广播类并定制广播哦: <application android:name="com.cxc.Mp3Player.util.Mp3Application" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner" > </uses-library> ...... <receiver android:name="com.cxc.Mp3Player.receiver.Mp3Receiver" android:exported="true" > <intent-filter> <action android:name="play" /><!-- 定制play广播 --> <action android:name="last" /><!-- 定制last广播 --> <action android:name="next" /><!-- ...... --> <action android:name="pause" /> <action android:name="cancel" /> </intent-filter> </receiver> </application>
相关文章推荐
- 横向ProgressBar的使用
- 读书笔记 疯狂Android讲义 第八章数据存储与IO之SharedPrefrences
- Android初学习 - 转载一篇Handler机制总结
- Android Studio 运行出现 Multiple dex files define Landroid/support/annotation/AnimRes;解决方法
- Android开源图表库 MPAndroidChart
- Android double保留两位小数:截取 和 四舍五入(展示流量)
- Android Studio 导入篇(1)编译不通过
- Android异步加载数据和图片的保存思路详解
- Android动画之Property属性动画--高级用法
- Android动态改变Background后Padding无效的问题
- Android项目开发前准备工作(一),android项目开发
- Android开发:V4包fragment, getActivity()报空以及页面产生混乱的解决方案
- 在android整机环境下,不去strip,添加调试信息
- android 图片压缩
- Android开发apk反编译和二次打包教程
- Android软件开发之盘点所有Dialog对话框大合集(一)
- Android性能测试工具 Emmagee
- android图片压缩质量参数Bitmap.Config RGB_565 ARGB_8888
- 讯飞语音包实现Android语音合成
- android 屏幕适配