android - Android:预期 1 个处理 android.media.browse.MediaBrowserService 的服务,找到 2 个
问题描述
我在 Firebase Crashylytics 中发现了一些与 MediaBrowserService 有关的崩溃。我认为这是因为我在 Manifest 中注册了两个服务,但只允许一个。
完整的堆栈跟踪
Caused by java.lang.IllegalStateException: Expected 1 service that handles android.media.browse.MediaBrowserService, found 2
at androidx.media.session.MediaButtonReceiver.getServiceComponentByAction(MediaButtonReceiver.java:318)
at androidx.media.session.MediaButtonReceiver.onReceive(MediaButtonReceiver.java:118)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3612)
at android.app.ActivityThread.access$1300(ActivityThread.java:238)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1805)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7099)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
AndroidManifest.xml 中的服务
<service
android:name=".ServiceFromMyApp"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
<service
android:name=".ServiceFromExternalLibrary"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
不幸的是,我两者都需要。有没有办法解决这个问题?或者我什至可以只使用一个?
解决方案
正如我从谷歌文档中看到的那样,只有在应用程序被终止并且用户尝试单击耳机上的按钮时才会调用 MediaButtonReceiver:
如果您运行的是 Android 8.0(API 级别 26)或更高版本,系统会尝试查找最后一个具有在本地播放音频的 MediaSession 的应用。如果会话仍然处于活动状态,Android 会直接将事件发送给它。否则,如果会话不活动并且它有一个媒体按钮接收器,Android 会将事件发送到接收器,接收器将重新启动会话,因此它可以接收事件。
(https://developer.android.com/guide/topics/media-apps/mediabuttons#finding-a-media-session)
所以,我认为这是一种罕见的情况,所以你可以从你的清单中删除这些行而不处理这种情况:
<receiver android:name="androidx.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
您可以实现自己的自定义 MediaButtonReceiver,当应用程序被终止时,它将选择适当的媒体服务来启动。
推荐阅读
- javascript - 如何检查字符串是否包含多个单词?
- wso2 - 将存储在 Iterator 中的属性添加为 Iterator 外部的兄弟姐妹
- node.js - 未安装 React-trello 以响应 JS 项目
- django - 跨越多个关系的 Django 数据库查询
- php - 当值为负时,laravel sum 集合忽略
- flutter - Flutter安装问题,如何解决这个问题?
- ios - Apple 帐户中缺少 NSFileProtectionNone
- excel - 在网络驱动器上共享 *.xlam - 调用 subs 和函数
- php - Lumen whereRaw 与 Prepared Statement 不返回任何内容
- sql - 尝试将值插入表时出错,但不确定原因