Android(minSDK=26)如何不离开应用调用后台默认播放器播放歌曲
解决方案
你的代码使用ACTION_VIEW会触发音乐播放器的UI界面启动,要实现后台调用已运行的默认音乐播放器播放,可通过以下两种方式处理:
方法一:更换播放Intent Action
使用专门的媒体播放Action替代ACTION_VIEW,避免唤起播放器UI:
Intent intent = new Intent("android.media.action.MEDIA_PLAY"); Uri uri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", new File(path)); intent.setDataAndType(uri, "audio/*"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent);
这个Action会请求已运行的媒体播放器直接处理播放请求,多数主流播放器会在后台响应而不弹出界面。
方法二:通过MediaController控制已活跃的媒体会话
如果方法一无效,可直接控制已在后台运行的默认音乐播放器的媒体会话,前提是播放器已启动并维持前台服务:
- 先在
AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
- 编写代码获取并控制目标播放器的会话:
MediaSessionManager mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE); Uri uri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", new File(path)); // 获取当前活跃的媒体会话列表 List<MediaSession.Token> activeSessions = mediaSessionManager.getActiveSessions(null); for (MediaSession.Token token : activeSessions) { MediaController mediaController = new MediaController(this, token); // 验证是否为默认音乐播放器 if (isDefaultMediaPlayer(mediaController.getPackageName())) { // 发送播放指定Uri的指令 mediaController.getTransportControls().playFromUri(uri, null); break; } } // 判断包名是否为默认音乐播放器的工具方法 private boolean isDefaultMediaPlayer(String targetPackage) { Intent testIntent = new Intent(Intent.ACTION_VIEW); testIntent.setType("audio/*"); ResolveInfo resolveInfo = getPackageManager().resolveActivity(testIntent, PackageManager.MATCH_DEFAULT_ONLY); return resolveInfo != null && resolveInfo.activityInfo.packageName.equals(targetPackage); }
这种方式直接操控已运行播放器的媒体控制逻辑,完全不会唤起UI界面,但需要播放器支持playFromUri指令(主流播放器均支持)。
注意事项:
- 确保FileProvider配置正确,外部存储文件需有对应读取权限(Android 10+建议使用Scoped Storage或申请
MANAGE_EXTERNAL_STORAGE权限)- 若默认播放器未在后台运行,上述方法可能无法生效,需额外处理启动逻辑
内容的提问来源于stack exchange,提问作者slowcoder
相关产品推荐
相关产品推荐

