最新版react-native-track-player在Android 12设备运行出现崩溃问题
问题根因
Android 12(API 31+)除了要求所有带<intent-filter>的四大组件必须显式声明android:exported属性外,媒体播放相关的后台服务、广播接收器还需要同时适配Android 12的前台服务启动限制、媒体会话权限规则。仅修改MediaButtonReceiver的exported属性,未同步修改关联的媒体播放服务配置,是触发二次崩溃的核心原因。
完整修复步骤
- 检查
AndroidManifest.xml中所有和媒体播放相关的组件配置,包括MediaButtonReceiver、自定义的媒体播放服务(比如继承MediaBrowserServiceCompat/MediaSessionService的服务类)、相关的广播接收器,全部显式配置android:exported属性:- 若组件需要接收外部应用(比如系统锁屏、蓝牙设备的媒体按钮事件)的调用,配置
android:exported="true" - 若组件仅应用内部调用,配置
android:exported="false"
- 若组件需要接收外部应用(比如系统锁屏、蓝牙设备的媒体按钮事件)的调用,配置
- 新增媒体播放前台服务权限与类型配置:
- 在Manifest根节点下添加权限声明:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />- 在媒体播放服务的配置节点中添加前台服务类型声明:
android:foregroundServiceType="mediaPlayback" - 调整媒体服务启动逻辑:Android 12禁止后台应用在无用户交互的情况下启动前台服务,启动媒体播放服务时必须保证应用处于前台,或调用
Context.startForegroundService()之后,在5秒内调用服务的startForeground()方法展示前台服务通知,否则会触发ANR或崩溃。 - 附上
MediaButtonReceiver+媒体服务的标准配置示例:
<!-- 媒体按钮广播接收器 --> <receiver android:name="androidx.media.session.MediaButtonReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> <!-- 自定义媒体播放服务 --> <service android:name=".YourMediaPlaybackService" android:exported="true" android:foregroundServiceType="mediaPlayback"> <intent-filter> <action android:name="android.media.browse.MediaBrowserService" /> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </service>
常见排查点
若完成上述配置后仍出现崩溃,可根据最新崩溃日志对应排查:
- 若报错为Foreground service did not call startForeground(),检查服务启动后是否及时调用了
startForeground方法,以及通知渠道是否适配Android 8.0+的要求 - 若报错为Permission Denial: starting Foreground Service,检查是否已正确声明
FOREGROUND_SERVICE_MEDIA_PLAYBACK权限,targetSdkVersion配置是否符合要求
内容的提问来源于stack exchange,提问作者KetanUbhada
相关产品推荐
相关产品推荐

