- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我的应用程序停止时单击耳机按钮时,我试图能够从我的应用程序开始音乐播放。
我可以使用 MediaSession.Callback onMediaButtonEvent()
或现已弃用的 registerMediaButtonEventReceiver()
收听媒体按钮点击而我的应用正在播放音乐,但是如果我暂停音乐一分钟,而我的 Activity 和播放服务仍在运行,然后我按下耳机按钮,我发现我失去了接收媒体按钮广播的能力。相反,Google Now 会打开。
我正在尝试做的是类似于 Google Play 音乐的东西。即使应用程序完全停止,它也可以开始播放音乐……后台没有服务。
我觉得setMediaButtonReceiver()是用于此的,但我无法让它工作。
setMediaButtonReceiver(PendingIntent mbr)
Set a pending intent for your media button receiver to allow restarting playback after the session has been stopped. If your app is started in this way an ACTION_MEDIA_BUTTON intent will be sent via the pending intent.
PendingIntent pi = PendingIntent.getBroadcast(HeadsetService.this, 0, new Intent(HeadsetService.this, RemoteControlReceiver.class), 0);
mMediaSession.setMediaButtonReceiver(pi);
我的 RemoteControlReceiver BroadcastReceiver 已在 Manifest 中注册,但是当我按下按钮时我没有收到任何广播。
最佳答案
首先,区分 MediaSessionCompat
很重要来自任何服务,例如 MediaBrowserServiceCompat
.MediaSessionCompat
正在与外部 MediaSessionStack
通信这决定了哪个应用程序将从外部 MediaSessionService
获取媒体键命令.在 API 26+ 上, key 将被发送到最后播放的应用程序。 API < 26 的设备将首先查找 Activity 播放/缓冲 session ,然后查找 Activity session ,然后查找最后一个播放 session 。后者允许应用程序通过保留 mMediaSesssion.isActive
来“窃取”焦点。在他们不应该标记的时候标记。有关优先级的更多详细信息,请参见 the official guide .
所以只要你的应用设置mMediaSesssion.isActive = true
在某个时刻并且最后一次播放时,它将获得媒体 key ,除非 mMediaSession.release()
被称为。后者从 MediaSessionStack
中删除您的 session 因此您的 session 将不再接收媒体 key 。这就是为什么调用 release()
很重要的原因。一旦您不再期望用户继续播放视频或音乐。还有一个警告:如果系统认为您的应用程序已被终止而不是正常结束,则该应用程序将从 MediaSessionStack
中删除同样,这是有道理的,因为在服务中 onDestroy()
在这种情况下不一定会调用,因此系统会为您释放 session 。当您滑开应用程序时,可能会发生这种情况。我使用的一种解决方法是在使用主应用程序时将服务保持在前台,然后在收到对 onTaskRemoved()
的调用后短暂延迟后结束服务。在服务中。
调用 mMediaSession.release()
如果你把它放在 onDestroy()
中会在某个时候发生您的服务。该服务预计将在不使用时结束,否则它会占用系统资源。因此,建议以 onStop()
结束。命令或刷掉应用程序或通知时。在您的情况下,电源管理器可能会在一段时间不活动后终止您的服务。根据实现,即使服务被销毁,播放器的某些部分可能仍然工作。此外,通知可能仍然存在,因为服务不再处于前台。这可能会让您误以为该服务正在运行。虽然没有更多细节,但我不能真正说出你的情况到底出了什么问题。
可能会阻止您的应用获取媒体 key 的另一个原因是您的 list 配置不正确。确保您的 BroadcaseReceiver
条目包括 android.intent.action.MEDIA_BUTTON
Intent 过滤器。
另一个可能的错误是初始化您的媒体 key 回调 MediaSessionCompat.Callback()
在服务或任何其他生命周期组件中。因此,如果该组件被破坏,它会很快导致意外行为。
TLDR:
过滤您的Logcat
对于 MediaSessionStack|MediaSessionService
以确保您的应用获取媒体 key 。如果没有,那么:
mMusicService.isActive = true
已设置(例如在 onPlay()
中)mMusicService.release()
不叫 androidx.media.session.MediaButtonReceiver
他们应该在MediaControllerCompat.Callback()
其状态不应依赖于任何服务或生命周期组件关于android - 如何使用 MediaSession.setMediaButtonReceiver(PendingIntent) 恢复播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39194548/
我想了解 PendingIntent.FLAG_NO_CREATE 的行为。我想知道它什么时候返回 null 什么时候不返回。这是事件发生的顺序: alarmIntent = new Intent(c
我正在尝试请求网络,因此我构建了 NetworkRequest 并构建了 PendingIntent, ConnectivityManager conn_manager = (Connectivit
我一直在使用警报管理器。一旦我设置了一个 PendingIntent 来触发警报,我想取消它。 How do I achieve this? 帮助将不胜感激。 最佳答案 下面这几行代码肯定可以帮助您删
我正在尝试在 Android 中创建一个 PendingIntent。这是代码 mNotificationIntent = new Intent(getApplicationContent(), My
我有三个 Activity (Home、Search、Destination),我可以用它们来描述我的用户体验流程。 Home Activity 是我的启动器 Activity ,然后是搜索 Acti
我试图从 API 中了解 PendingIntent 的用途。 有时我使用的一些方法需要这样做,但我仍然没有得到正确的想法。 谁能解释一下吗?为什么我不能只使用上下文? 谢谢 莫希克 最佳答案 Pen
我在 Android 中开发闹钟时遇到问题。当我触发包含必须在计划时间启动的 Activity 的 PendingIntent 时,它运行良好。但是,当闹钟响起并且我按贪睡 5 分钟并使用不同的请求代
我得到了一个 IntentService,它在 onHandleIntent(Intent) 中同步执行一些长时间运行的工作。因此,只要服务运行,我就会显示一个通知。现在我想在用户点击通知后停止服务。
我有这个... button = (Button) findViewById(R.id.start_repeating); button.setOnClickListener(new OnClickL
在我的应用程序中,我有一个显示 2 个选项的对话框:Copy 和 Dismiss 当用户单击 Copy 时,我希望在状态栏中收到通知。 public void showDialog(final Str
我有一个会显示通知的服务。通知显示正确,但当我点击通知时没有任何反应。它应该在我的应用程序中打开一个 Activity 。这是我的代码: public class ServiceCheckExpens
我正在我的游戏中创建一个通知。如果玩家有一段时间没有玩游戏,我想显示通知。我正在使用以下带有警报设置的 PendingIntent 来创建通知。有了这个,我就可以创建通知。 问题:如果玩家玩游戏,我需
所以这段代码是在我的服务开始在前台启动后从内部运行的。这也会创建将留在那里的通知。我有很多问题/疑问: 1) 点击通知只会打开应用信息,不会打开我的 PendingIntent。 2) 未设置我的内容
如何创建多个 PendingIntent?我有几个通知,当用户按下最后一个通知时,一切正常,但点击通知没有响应。我的代码是: Intent notificationIntent = new Inten
我正在运行一项服务,该服务会在特定事件的通知栏上发出通知。在该通知中,我设置了一个 PendingIntent 以启动另一个应用程序。出于某种原因,当我根据通知采取行动时,它不会启动其他应用程序。这是
我有一个名为 sendNotification 的方法,可以多次调用。 private PendingIntent createNotificationIntent(Context context,
我有一个导航应用程序。我想获得可能暂时不会到达的位置信息,具体取决于 GPS 锁定所需的时间——或者接收信号不好时的时间。 我计划使用 LocationManager.requestLocationU
我有一个 Android 库,它有一个创建 Notification 的 Service。据我了解,Notification 必须有一个 contentIntent (PendingIntent) 集
当我们将 0 作为标志传递给 PendingIntent 时,如下所示: PendingIntent pi=PendingIntent.getActivity(this, 1, i, 0); does
我在尝试通过 Intent 和未决 Intent 将数据传递给 BroadcastReceiver 时遇到了一些问题,涉及接近警报。更具体地说,我试图传递一个对象,其中包括用户不断变化的位置。我已经尝
我是一名优秀的程序员,十分优秀!