开发WearOS音频播放应用时,为何获取MediaBrowserServices仅返回蓝牙服务?
我正在开发一款可从WearOS启动音频播放的应用,需要手机端获取可播放歌曲列表,因此打算采用MediaBrowserService实现。但尝试获取MediaBrowserServices列表时,仅得到“Bluetooth audio”服务,而参考的官方示例应用却能正常显示所有相关音乐应用。
使用的代码如下:
override fun onStart() { super.onStart() val mediaBrowserIntent = Intent(MediaBrowserServiceCompat.SERVICE_INTERFACE) val packageManager = this.packageManager val services = packageManager.queryIntentServices(mediaBrowserIntent, PackageManager.GET_RESOLVED_FILTER) val tv: TextView = findViewById(R.id.helloworld) val res = StringBuilder() for(info in services) { res.appendLine(info.serviceInfo.loadLabel(packageManager).toString()) } tv.text = res.toString() }
Android 11+包可见性限制
从Android 11(API 30)开始,系统默认限制应用对其他应用的可见性,你的应用无法自动探测到所有实现MediaBrowserService的应用。需要在AndroidManifest.xml中添加<queries>标签,声明需要访问的服务类型:<queries> <intent> <action android:name="android.media.browse.MediaBrowserService" /> </intent> </queries>配置后系统才会允许你的应用查询到所有注册了该Service接口的应用。
缺少必要权限
如果应用运行在Android 11之前的版本,可能需要QUERY_ALL_PACKAGES权限(Android 11+优先用<queries>,该权限提交应用市场需额外说明理由),可在Manifest中添加:<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />查询Flag参数不足
你使用的PackageManager.GET_RESOLVED_FILTER可能无法覆盖所有匹配的服务,尝试替换为PackageManager.MATCH_ALL(需配合<queries>使用),确保能获取到所有符合条件的服务:val services = packageManager.queryIntentServices(mediaBrowserIntent, PackageManager.MATCH_ALL)目标音乐应用未正确注册服务
部分音乐应用可能未在Manifest中正确声明MediaBrowserService的Intent Filter,检查目标应用的Manifest是否包含类似如下配置:<service android:name=".MyMediaBrowserService" android:exported="true"> <intent-filter> <action android:name="android.media.browse.MediaBrowserService" /> </intent-filter> </service>若无此声明,该应用无法被你的代码查询到。
内容的提问来源于stack exchange,提问作者Luca S.

