通知中的播放/暂停按钮图像,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】:

这应该可行。只需将您的 notificationnotificationManager 设为静态全局变量即可。

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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WKWebview 中添加观察者以播放和暂停音频文件的操作?

如何在不启动 Activity 的情况下使用通知中的操作

从 Swift 中的属性检查器列表更改条形按钮图像

暂停 HTML5 视频时显示海报图像或暂停按钮?

通知中的音乐播放器控制

当 AVAudioPlayer 完成播放时切换 tableview 单元格图像