Android音乐播放器---实现Notification控制音乐播放
2017-02-14 21:01
429 查看
服务、广播接收者、通知共同实现通知栏音乐播放控制:
准备工作:
定义接口,用于传递音乐的播放信息:
[java] view
plaincopy
public interface IMusic {
public void moveon();//继续
public void pause();//暂停
public void stop();//停止
public void nextSong();//下一曲
public void lastSong();//上一曲
}
定义Application类,用于传递全局变量:
[java] view
plaincopy
public class Mp3Application extends Application {
public List<Song> songsList;//当前播放列表
public int songItemPos;//当前播放音乐在列表中的位置
public NotificationManager notManager;
public IMusic music;
}
定义Service类,用于控制音乐播放:
[java] view
plaincopy
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
21c80
(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):
[java] view
plaincopy
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的广播并控制音乐播放:
[java] view
plaincopy
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);
}
}
}
最后别忘了在清单文件中声明广播类并定制广播哦:
[html] view
plaincopy
<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>
大功告成!
为区分通知栏点击的是哪个控件,刚开始我是想通过在意图中通过putExtra()方法添加参数,来区分控件,但后来实现发现行不通。之后我便转换思路用action来区分,成功为不同控件实现了不同的点击响应。不知道区分点击事件还有没有其他方法,还请贴心的基友指出来哦!
准备工作:
定义接口,用于传递音乐的播放信息:
[java] view
plaincopy
public interface IMusic {
public void moveon();//继续
public void pause();//暂停
public void stop();//停止
public void nextSong();//下一曲
public void lastSong();//上一曲
}
定义Application类,用于传递全局变量:
[java] view
plaincopy
public class Mp3Application extends Application {
public List<Song> songsList;//当前播放列表
public int songItemPos;//当前播放音乐在列表中的位置
public NotificationManager notManager;
public IMusic music;
}
定义Service类,用于控制音乐播放:
[java] view
plaincopy
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
21c80
(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):
[java] view
plaincopy
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的广播并控制音乐播放:
[java] view
plaincopy
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);
}
}
}
最后别忘了在清单文件中声明广播类并定制广播哦:
[html] view
plaincopy
<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>
大功告成!
为区分通知栏点击的是哪个控件,刚开始我是想通过在意图中通过putExtra()方法添加参数,来区分控件,但后来实现发现行不通。之后我便转换思路用action来区分,成功为不同控件实现了不同的点击响应。不知道区分点击事件还有没有其他方法,还请贴心的基友指出来哦!
相关文章推荐
- Android音乐播放器---实现Notification控制音乐播放
- Android音乐播放器---实现Notification控制音乐播放
- Android音乐播放器---实现Notification控制音乐播放
- Swift如何实现音乐播放,后台播放及控制。
- 实现Activity中控制service里音乐播放、暂停的两种方式
- HTML5+JavaScript+CSS实现音乐播放器——难点二:自己设计一个控制音乐播放的控制器
- 实现点击通知栏发送广播控制音乐的播放、暂停、上一曲、下一曲
- AS3.0实现音乐的播放,停止,暂停,和音量的控制
- 控制音乐播放器的退出再次播放相同音乐的功能实现
- Android中通过耳机按键控制音乐播放的实现
- Android中通过耳机按键控制音乐播放的实现
- 使用手机控制电脑 实现音乐播放 电影播放控制 关机等操作
- Android实战 - 音心播放器 (通知实现音乐的播放/暂停/下一曲控制)
- Unity中实现在切换场景时控制音乐的同步播放
- OpenWrt - MPDroid实现Android手机控制OpenWRT播放音乐
- HTML5+JavaScript+CSS实现音乐播放器——难点二:自己设计一个控制音乐播放的控制器
- IOS 控制音量并实现后台播放音乐
- [原创]网页中自动连续播放音乐文件的实现
- VC下实现循环播放MP3,wma等音乐
- 解决关于如何实现锁屏后继续播放音乐的问题