You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13(API33)获取支持Intent.ACTION_MEDIA_BUTTON的应用包问题

Android 13(API33)中获取处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:43:24