Android 13(API33)获取支持Intent.ACTION_MEDIA_BUTTON的应用包问题
失效原因
- API废弃与权限限制:Android 13将
PackageManager.queryBroadcastReceivers()标记为废弃,同时新增严格权限管控——普通第三方应用默认仅能查询自身注册的广播接收器,无法获取其他应用注册的隐式广播接收器(包括监听Intent.ACTION_MEDIA_BUTTON的接收器)。 - 隐式广播可见性收紧:为提升系统隐私与安全性,从Android 12开始系统逐步缩小隐式广播的可见范围,到Android 13直接阻断了非系统应用通过旧API获取其他应用广播接收器信息的路径。
适配Android 13的解决方案
步骤1:添加必要权限
在AndroidManifest.xml中声明QUERY_ALL_PACKAGES权限(若你的应用属于Google允许豁免该权限的场景,可通过对应规则申请豁免,否则需声明此权限):
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
步骤2:使用新API查询接收器
替换原废弃API,使用queryIntentReceivers()并指定匹配标记:
// 获取所有支持处理ACTION_MEDIA_BUTTON的应用 Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); List<ResolveInfo> mediaPlayers = getPackageManager().queryIntentReceivers( mediaButtonIntent, PackageManager.MATCH_ALL ); // 遍历结果提取包名 for (ResolveInfo info : mediaPlayers) { String packageName = info.activityInfo.packageName; // 此处添加包名处理逻辑 }
补充说明
若你仅需获取当前活跃的媒体会话(而非所有已安装的支持应用),推荐使用MediaSessionManager的API,无需申请QUERY_ALL_PACKAGES权限:
MediaSessionManager mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE); List<MediaSession.Token> activeSessionTokens = mediaSessionManager.getActiveSessions(null); // 通过token获取对应活跃应用的信息
内容的提问来源于stack exchange,提问作者mkabatek
相关产品推荐
相关产品推荐

