为啥我只能在我的 android 通知中按一次播放/暂停按钮?

Posted

技术标签:

【中文标题】为啥我只能在我的 android 通知中按一次播放/暂停按钮?【英文标题】:Why can I only press my play/pause buttons once in my android notification?为什么我只能在我的 android 通知中按一次播放/暂停按钮? 【发布时间】:2019-12-01 20:40:31 【问题描述】:

我为我的媒体应用构建了一个通知,让用户可以播放/暂停他们的音频。但是现在他们只能按一次通知中的按钮。我怎样才能得到它,以便用户可以连续点击播放/暂停按钮?

我尝试在我的活动中创建一个新通知,作为刷新信息的一种方式,但这还没有给我带来太多结果。

构建通知

public void Init(DabPlayer Player, bool IntegrateWithLockScreen)
        
            player = Player;
            var mSession = new MediaSessionCompat(Application.Context, "MusicService");
            mSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls);
            var controller = mSession.Controller;
            var description = GlobalResources.playerPodcast;

            if (IntegrateWithLockScreen)
            
                /* SET UP LOCK SCREEN */
                CreateNotificationChannel();

                player.EpisodeDataChanged += (sender, e) =>
                
                    // Set up an intent so that tapping the notifications returns to this app:
                    Intent intent = new Intent(Application.Context, typeof(MainActivity));
                    Intent playPauseIntent = new Intent(Application.Context, typeof(SecondActivity));
                    // Create a PendingIntent; we're only using one PendingIntent (ID = 0):
                    const int pendingIntentId = 0;
                    const int firstPendingIntentId = 1;
                    PendingIntent firstPendingIntent =
                        PendingIntent.GetActivity(Application.Context, firstPendingIntentId, intent, PendingIntentFlags.OneShot);
                    PendingIntent pendingIntent =
                        PendingIntent.GetActivity(Application.Context, pendingIntentId, playPauseIntent, PendingIntentFlags.OneShot);

                    // Build the notification:
                    var builder = new NotificationCompat.Builder(Application.Context, CHANNEL_ID)
                                  .SetStyle(new android.Support.V4.Media.App.NotificationCompat.MediaStyle()
                                            .SetMediaSession(mSession.SessionToken)
                                            .SetShowActionsInCompactView(0, 1))
                                  .SetVisibility(NotificationCompat.VisibilityPublic)
                                  .SetContentIntent(firstPendingIntent) // Start up this activity when the user clicks the intent.
                                  .SetDeleteIntent(MediaButtonReceiver.BuildMediaButtonPendingIntent(Application.Context, PlaybackState.ActionStop))
                                  .SetSmallIcon(Resource.Drawable.app_icon) // This is the icon to display
                                  .AddAction(Resource.Drawable.ic_media_pause_dark, "Pause", pendingIntent)
                                  .AddAction(Resource.Drawable.ic_media_play_dark, "Next", pendingIntent)
                                  .SetContentText(GlobalResources.playerPodcast.EpisodeTitle)
                                  .SetContentTitle(GlobalResources.playerPodcast.ChannelTitle);

                    // Finally, publish the notification:
                    var notificationManager = NotificationManagerCompat.From(Application.Context);
                    notificationManager.Notify(NOTIFICATION_ID, builder.Build());                   
                ;

                player.EpisodeProgressChanged += (object sender, EventArgs e) =>
                

                ;


            

然后我的活动看起来像这样

[Activity]
    public class SecondActivity : Activity
    
        DabPlayer player = GlobalResources.playerPodcast;
        EpisodeViewModel Episode;
        DroidDabNativePlayer droid = new DroidDabNativePlayer();
        protected override void OnCreate(Bundle bundle)
        
            base.OnCreate(bundle);

            if (player.IsReady)
            
                if (player.IsPlaying)
                
                    player.Pause();
                    droid.Init(player, true);
                
                else
                
                    player.Play();
                    droid.Init(player, true);
                
            
            else
            
                if (player.Load(Episode.Episode))
                
                    player.Play();
                    droid.Init(player, true);
                
                else
                
                    //DisplayAlert("Episode Unavailable", "The episode you are attempting to play is currently unavailable. Please try again later.", "OK");
                

            

            Finish();
        
    

如果有人也想为我指出正确的方向,我还想按下一个按钮,让它根据状态在显示暂停和播放之间切换。

感谢任何帮助!谢谢!

【问题讨论】:

你的意思是他们只能按一次播放?第二次会发生什么?你刷新通知的结果是什么? 它不响应第二次点击事件。他们第二次点击后什么也没有发生。刷新通知不允许我再次点击按钮。 现在有 2 个按钮在做同样的事情,只是看起来不同,但如果我点击其中一个,我什至无法点击另一个。它似乎只是在第一个事件之后杀死了按钮交互。 【参考方案1】:

https://developer.android.com/reference/android/app/PendingIntent

OneShot 的 PendingIntent 只能使用一次。

指示此 PendingIntent 只能使用一次的标志。 如果设置,则在调用 send() 后,它将自动为您取消,以后任何通过它发送的尝试都将失败。

要么使用不带标志的 PendingIntent(以允许用户多次按下按钮并发送多个意图),要么在每次请求 PendingIntent 时使用新 ID,以允许每次按下按钮一次更新通知的时间。

【讨论】:

工作就像一个魅力!谢谢!

以上是关于为啥我只能在我的 android 通知中按一次播放/暂停按钮?的主要内容,如果未能解决你的问题,请参考以下文章

为啥提交按钮仅在我的示例中按下两次时才起作用?

在熊猫中按一列随机排列行

为啥当我在编辑器中按下播放时 Unity 会崩溃?

当我设置为仅编译播放服务广告时,为啥 Android Studio gradle 仍然在我的 apk 中包含用于 google play services 分析的库?

为啥我的 UILocalNotification 没有播放任何声音?

科尔多瓦应用程序为啥我可以在 ios 上播放我的媒体但在 android 上失败?