媒体样式通知操作按钮不适用于 PendingIntent.getBroadcast()
Media Style Notification action buttons not working with PendingIntent.getBroadcast()
我正在使用 NotificationCompat.MediaStyle()
创建一个带有通知样式的音乐播放器。
我实现了我的代码,以便在我的通知中单击操作按钮时发送广播。但我的代码似乎不起作用。
我的代码如下:
NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
.setShowWhen(false)
// Set the Notification style
.setStyle(new NotificationCompat.MediaStyle()
// Attach our MediaSession token
.setMediaSession(mediaSession.getSessionToken())
// Show our playback controls in the compact notification view.
.setShowActionsInCompactView(0, 1, 2))
// Set the Notification color
.setColor(getResources().getColor(R.color.colorPrimary))
// Set the large and small icons
.setLargeIcon(largeIcon)
.setSmallIcon(android.R.drawable.stat_sys_headset)
// Set Notification content information
.setContentText("Artist Name")
.setContentTitle("Album name")
.setContentInfo("Title name")
// Add playback actions
.addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3))
.addAction(notificationAction, "pause", play_pauseAction)
.addAction(android.R.drawable.ic_media_next, "next", playbackAction(2));
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).notify(NOTIFICATION_ID, notificationBuilder.build());
方法playBackAction()
如下:
private PendingIntent playbackAction(int actionNumber){
Intent playbackAction;
switch(actionNumber){
case 0:
// Play
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_PLAY);
return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
case 1:
// Pause
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_PAUSE);
return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
case 2:
// Next track
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_NEXT);
return PendingIntent.getService(this, actionNumber, playbackAction, 0);
case 3:
// Previous track
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_PREVIOUS);
return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
default:
break;
}
return null;
}
我的BroadcastReceiver如下:
BroadcastReceiver broadCastPlayback=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent)
{
// TODO: Implement this method
showToast("onReceive");
}
};
我在 android service
的 onCreate
中注册了广播接收器
IntentFilter filter=new IntentFilter(BROADCAST_PLAYBACK);
registerReceiver(broadCastPlayback,filter);
onReceive
里面的showToast()
方法没有被调用。请问broadcast
是没有发送还是没有收到。
您遇到的问题是过滤器缺少待处理意图中发送的操作。
例如:.addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3))
将发送动作ACTION_PREVIOUS
但广播接收器仅在 BROADCAST_PLAYBACK
上过滤
您需要向过滤器添加(或将 BROADCAST_PLAYBACK 替换为)缺失的操作。
下面的例子:
filter.addAction(ACTION_PREVIOUS);
以同样的方式添加您定义的其他动作。
我正在使用 NotificationCompat.MediaStyle()
创建一个带有通知样式的音乐播放器。
我实现了我的代码,以便在我的通知中单击操作按钮时发送广播。但我的代码似乎不起作用。
我的代码如下:
NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
.setShowWhen(false)
// Set the Notification style
.setStyle(new NotificationCompat.MediaStyle()
// Attach our MediaSession token
.setMediaSession(mediaSession.getSessionToken())
// Show our playback controls in the compact notification view.
.setShowActionsInCompactView(0, 1, 2))
// Set the Notification color
.setColor(getResources().getColor(R.color.colorPrimary))
// Set the large and small icons
.setLargeIcon(largeIcon)
.setSmallIcon(android.R.drawable.stat_sys_headset)
// Set Notification content information
.setContentText("Artist Name")
.setContentTitle("Album name")
.setContentInfo("Title name")
// Add playback actions
.addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3))
.addAction(notificationAction, "pause", play_pauseAction)
.addAction(android.R.drawable.ic_media_next, "next", playbackAction(2));
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).notify(NOTIFICATION_ID, notificationBuilder.build());
方法playBackAction()
如下:
private PendingIntent playbackAction(int actionNumber){
Intent playbackAction;
switch(actionNumber){
case 0:
// Play
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_PLAY);
return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
case 1:
// Pause
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_PAUSE);
return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
case 2:
// Next track
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_NEXT);
return PendingIntent.getService(this, actionNumber, playbackAction, 0);
case 3:
// Previous track
playbackAction = new Intent(BROADCAST_PLAYBACK);
playbackAction.setAction(ACTION_PREVIOUS);
return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
default:
break;
}
return null;
}
我的BroadcastReceiver如下:
BroadcastReceiver broadCastPlayback=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent)
{
// TODO: Implement this method
showToast("onReceive");
}
};
我在 android service
onCreate
中注册了广播接收器
IntentFilter filter=new IntentFilter(BROADCAST_PLAYBACK);
registerReceiver(broadCastPlayback,filter);
onReceive
里面的showToast()
方法没有被调用。请问broadcast
是没有发送还是没有收到。
您遇到的问题是过滤器缺少待处理意图中发送的操作。
例如:.addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3))
将发送动作ACTION_PREVIOUS
但广播接收器仅在 BROADCAST_PLAYBACK
您需要向过滤器添加(或将 BROADCAST_PLAYBACK 替换为)缺失的操作。
下面的例子:
filter.addAction(ACTION_PREVIOUS);
以同样的方式添加您定义的其他动作。