为什么包 "com.android.bluetooth" 在三星设备上查询我们的 MediaBrowserService?

Why is package "com.android.bluetooth" querying our MediaBrowserService on Samsung devices?

我们的应用程序包含一个 MediaBrowserService 并使用白名单来限制谁可以查询该服务。它通常用于允许 Android Auto 和 Android Wear 来查询我们的应用程序的音频内容。据我所知,这仍然是一种推荐的方法。例如,如此 Google 示例应用程序所示:MediaBrowserService sample app

我们的应用程序报告了试图查询我们的 MediaBrowserService 但不在白名单中的包名称。我们经常收到 "com.android.bluetooth" 试图调用我们的服务但被拒绝的报告。

我对这些报告感到困惑。我们从未在我们自己的测试设备上看到过来自此包的此类调用。我之前尝试询问用户是否有可能显示音频信息的蓝牙设备时遇到了困惑……所以似乎 Android 本身正在进行这些调用?

有没有人遇到过这个?这种白名单方法需要验证特定的签名证书。 com.android.bluetooth是否有可用于将此包添加到白名单的一致签名证书?

更新 1:

查看我们从用户那里收到的报告,这似乎完全是三星 Android 6.0.1 的现象。它的第一份报告出现在 2016 年 3 月 13 日,整个夏天都有稳定的涓涓细流。

以下是报告此问题的部分模型列表。他们都拥有 Android 6.0.1。这可能与他们基于 Tizen 的 Galaxy Gear 手表有关吗?

更新 2:

我终于在装有 6.0.1 的 Galaxy S6 Edge 上重现了这种情况。只需打开设备上的蓝牙即可。如果打开,甚至没有任何配对或连接,当我开始在我们的应用程序中播放音频时 "com.android.bluetooth" (UID 1002) 在我们的 MediaBrowserService 上调用 onGetRootonLoadChildren。为什么!?如果我允许,设备上没有任何可见的变化。我以为我可能会看到一些三星小部件显示我们应用程序的媒体信息...但我没有。

这很可能与 Android 5.0 为用户和应用程序开发人员提供的新功能有关,其中包括最著名的新功能 Android 5.0 APIs

Media browsing

所述

Android 5.0 introduces the ability for apps to browse the media content library of another app, through the new android.media.browse API.

最近 Android 5.0 Behavior Changes, you should carefully assess possible impacts on your app for the given points to consider such as Custom Permissions。除此之外,还建议您立即检查您的应用程序,进行任何必要的调整,并尽快向您的用户发布更新版本。

希望对您有所帮助!

我偶然发现了某种答案。由于可能只有 Samsung 的某个人知道的原因,包裹 "com.android.bluetooth" 的 MediaBrowserServiceCompat.onGetRoot 调用与 MediaSessionCompat.setMediaButtonReceiver 相关。

如果您按照 Using media buttons to restart an inactive media session 文档中解释的方式使用 MediaSessionCompat,这些三星设备会在媒体按钮事件之前使用 com.android.blueooth 包查询 MediaBrowserServiceCompat.onGetRoot当 Android 尝试恢复最后一个活动的 MediaSession 时被发送到 MediaSessionCompat.setMediaButtonReceiver 配置的 BroadcastReceiver

如果由于您没有将 com.android.bluetooth 包列入白名单而对 onGetRoot return 的调用为 null,则您的 BroadcastReceiver 将不会接收媒体按钮事件并且不活动的媒体会话将不会不会复活。您可以将包和 return 正常 BrowserRoot 的真实数据完全列入白名单,或者 return 一个空的 BrowserRoot。例如,new MediaBrowserServiceCompat.BrowserRoot("myroot", null)。三星似乎并没有实际使用根数据或对 MediaBrowserServive.onLoadChildren 进行后续调用,因此您 return 响应 com.android.bluetooth 进行的 onGetRoot 调用似乎无关紧要,它只是不能 null.

同样,这种情况似乎是三星 6.0.1 Android 版本独有的。我没有遇到任何其他设备或任何其他三星 Android 构建执行此奇怪调用 com.android.bluetooth。