Android 13(SDK34)前台服务媒体通知无法显示在锁屏
Android 13 媒体前台服务通知不显示在锁屏的修复方案
关键修复点
1. 补充Android 13+必填通知权限
Android 13(API 33+)要求必须申请POST_NOTIFICATIONS权限才能显示任何通知,包括前台服务通知。
- 在
AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
- 在HomeActivity启动服务前动态申请权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { startForegroundService(new Intent(this, MyService.class)); } }).launch(Manifest.permission.POST_NOTIFICATIONS); } else { startForegroundService(new Intent(this, MyService.class)); } }
2. 修复Manifest服务标签的语法错误
你的服务标签存在拼写错误,serviceandroid需拆分为service android,否则服务无法正确注册:
<service android:name=".etc.MyService" android:foregroundServiceType="mediaPlayback" android:permission="android.permission.FOREGROUND_SERVICE"/>
3. 修改通知Category为媒体传输类型
当前代码将通知Category设为CATEGORY_SERVICE,系统会识别为普通服务通知而非媒体通知,需改为CATEGORY_TRANSPORT:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) // ... 其他属性保持不变 .setCategory(NotificationCompat.CATEGORY_TRANSPORT) // 替换原CATEGORY_SERVICE .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) // ... 其他属性保持不变
4. 完善MediaSession配置
添加MediaSession回调逻辑,避免系统判定会话非活跃而隐藏锁屏通知:
MediaSessionCompat mediaSession = new MediaSessionCompat(this, "TTS_MediaSession"); mediaSession.setCallback(new MediaSessionCompat.Callback() { @Override public void onPlay() { super.onPlay(); } @Override public void onPause() { super.onPause(); } @Override public void onSkipToPrevious() { super.onSkipToPrevious(); } @Override public void onSkipToNext() { super.onSkipToNext(); } }); mediaSession.setActive(true);
5. 验证系统锁屏通知设置
引导用户检查系统权限:
- 系统设置 → 应用 → 你的应用 → 通知 → 锁屏通知 → 设置为「显示」或「显示敏感内容」
内容的提问来源于stack exchange,提问作者Cra ck
相关产品推荐
相关产品推荐

