通知中的播放/暂停按钮图像,Android
Posted
技术标签:
【中文标题】通知中的播放/暂停按钮图像,Android【英文标题】:play/pause button image in notification ,Android 【发布时间】:2014-08-17 16:29:51 【问题描述】:我已经实现了音乐播放器,它会在播放流音频时触发自定义通知。
一切正常,我可以使用通知中的按钮播放/暂停音频。唯一的问题是图像按钮:它无法通过单击按钮来更改图像以指示播放/暂停。
在 RemoteReceiver 中使用 remoteViews.setImageViewResource() 不起作用。控制是使用 BroadcastReceiver 完成的,这是从播放器活动触发通知的代码:
public void setNotification(String songName)
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager notificationManager = (NotificationManager) getSystemService(ns);
@SuppressWarnings("deprecation")
Notification notification = new Notification(R.drawable.ic_launcher, null, System.currentTimeMillis());
RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.notification_view);
notificationView.setImageViewResource(R.id.button1, R.drawable.pause);
notificationView.setTextViewText(R.id.textView1, songName);
//the intent that is started when the notification is clicked (works)
Intent notificationIntent = new Intent(this, PlayerActivity.class);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.contentView = notificationView;
notification.contentIntent = pendingNotificationIntent;
Intent switchIntent = new Intent("com.example.test.ACTION_PLAY");
PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(this, 0, switchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationView.setOnClickPendingIntent(R.id.play_pause, pendingSwitchIntent);
notificationManager.notify(1, notification);
notification.xml 内容为
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>
<ImageView
android:layout_alignParentLeft="true"
android:layout_
android:layout_
android:src="@drawable/ic_launcher"
android:id="@+id/imgAppIc" />
<TextView
android:layout_toRightOf="@id/imgAppIc"
android:singleLine="true"
android:id="@+id/textView1"
android:ellipsize="marquee"
android:layout_marginLeft="7dp"
android:layout_marginTop="10dp"
android:marqueeRepeatLimit ="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
android:layout_
android:layout_/>
<ImageButton
android:id="@+id/play_pause"
android:layout_
android:layout_
android:layout_toLeftOf="@+id/play"
/>
</RelativeLayout>
这是 RemoteRecivier 类
public class RemoteControlReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.notification_view);
if(action.equalsIgnoreCase("com.example.test.ACTION_PLAY"))
if(mediaplayer.isPlaying())
mediaplayer.pause();
remoteViews.setImageViewResource(R.id.button1, R.drawable.play);
else
mediaplayer.start();
remoteViews.setImageViewResource(R.id.button1, R.drawable.pause);
最后,清单是
<receiver android:name=".RemoteControlReceiver">
<intent-filter>
<action android:name="com.Music.app.ACTION_PLAY" />
</intent-filter>
</receiver>
<activity android:name="PlayerActivity" />
【问题讨论】:
【参考方案1】:您必须在更改后将 notification.contentView 设置为新的 remoteView,以便它可以更新通知视图本身。
意思是,在您在 BroadcastReceiver 中收到操作后,使用所需的按钮显示(暂停或播放)重新构建您的通知
希望对你有帮助
【讨论】:
这样做,通知不会闪烁吗? Twinkle 你会在这里发布答案(带代码)吗?请我们尝试这个几天..设置 notification.contentView = new remoteView() 通知按钮仍然不起作用。 @OmkarJadhav 就像 AlAsiri 所说的那样工作。更改并更改按钮图像后,重新通知 notificationManager.notify(1, notification);这将显示更新。并确保使用相同的 ID,这里是第 1 号。希望你现在得到它并告诉我你是否需要帮助 但这不会是新通知吗? @suku 使用相同的 id 来避免这个问题【参考方案2】:这应该可行。只需将您的 notification
和 notificationManager
设为静态全局变量即可。
public class RemoteControlReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
if(action.equalsIgnoreCase("com.example.test.ACTION_PLAY"))
if(mediaplayer.isPlaying())
mediaplayer.pause();
notificationView.setImageViewResource(R.id.button1, R.drawable.play);
notification.contentView = notificationView;
notificationManager.notify(1, notification);
else
mediaplayer.start();
notificationView.setImageViewResource(R.id.button1, R.drawable.pause);
notification.contentView = notificationView;
notificationManager.notify(1, notification);
【讨论】:
这里有些奇怪。我有相同的员工,但不工作。你怎么能这样访问notificationView? Service1.mNotificationManager.notify(1, Service1.mBuilder.build());这一行使应用程序崩溃...【参考方案3】:大家好,您只需要更新“notificationManager.notify(1, notification);” 在您对同一通知进行更改后,在您的 onReceiver 方法中。 将公共静态分配给您的 notification 和 notificationManager 并在您的 BroadcastReceiver 扩展类中使用。
看下面的代码就知道了:
public void onReceive(Context context, Intent intent)
String action1 = intent.getStringExtra("action1");
// String action2 = intent.getStringExtra("action2");
Log.i("Intent Received","Yes");
if(say)
if (action1.equals("PauseAction"))
performAction1();
say = false;
else if(!say)
if (action1.equals("PauseAction"))
performAction2();
say = true;
public void performAction1()
if (mediaPlayer!=null)
if(mediaPlayer.isPlaying())
playButtonImage.setImageResource(R.drawable.playbutton);
playButtonImage.setContentDescription("Play Button ");
notificationView.setImageViewResource(R.id.remoteViewImageView,R.drawable.playbutton);
mediaPlayer.pause();
play = true;
MainActivity.notificationManager.notify(1, notification);
Log.i("performAction1 called ","Yes");
public void performAction2()
if (mediaPlayer != null)
mediaPlayer.start();
playButtonImage.setImageResource(R.drawable.pause);
playButtonImage.setContentDescription("Pause Button");
notificationView.setImageViewResource(R.id.remoteViewImageView,R.drawable.pause);
MainActivity.notificationManager.notify(1, notification);
play = false;
Log.i("performAction2 called ", "Yes");
【讨论】:
【参考方案4】:为什么不使用 ImageView 而不是 ImageButton?使用 ImageView,您可以简单地使用 removeViews.setImageViewResource(R.id.button1, R.drawable.pause);
更改其外观
【讨论】:
我没有想到这个..我以前从未尝试过,下次我会尝试。 @Jason Imageview 或 ImageButton 无关紧要。 setImageViewResource() 对它们都做同样的工作。以上是关于通知中的播放/暂停按钮图像,Android的主要内容,如果未能解决你的问题,请参考以下文章