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

Android平台如何暂停音频程序?求实现Youtube Music与系统音乐暂停恢复的Java代码

实现Youtube Music与Android Music的暂停/恢复功能(基于MediaController)

前提配置

首先在AndroidManifest.xml中添加必要的权限和包可见性声明,确保能访问目标音乐应用:

<!-- 基础媒体控制权限 -->
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
<!-- Android 13+ 需要通知权限才能控制媒体 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<!-- Android 11+ 包可见性配置,指定目标应用 -->
<queries>
    <package android:name="com.google.android.music" /> <!-- Android Music -->
    <package android:name="com.google.android.apps.youtube.music" /> <!-- Youtube Music -->
</queries>

核心代码实现

下面是一个工具类,封装了针对指定音乐应用的暂停/恢复逻辑:

import android.content.Context;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.os.Build;
import android.util.Log;

import java.util.List;

public class MusicControlHelper {
    private static final String TAG = "MusicControlHelper";

    // 暂停指定包名的音乐应用
    public static void pauseAppMusic(Context context, String targetPackage) {
        controlMusic(context, targetPackage, true);
    }

    // 恢复指定包名的音乐应用
    public static void resumeAppMusic(Context context, String targetPackage) {
        controlMusic(context, targetPackage, false);
    }

    private static void controlMusic(Context context, String targetPackage, boolean isPause) {
        MediaSessionManager sessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
        if (sessionManager == null) {
            Log.e(TAG, "MediaSessionManager not available");
            return;
        }

        List<MediaController> controllers;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            controllers = sessionManager.getActiveSessions(null);
        } else {
            controllers = sessionManager.getActiveSessions(null); // 兼容低版本,参数可为null
        }

        for (MediaController controller : controllers) {
            String packageName = controller.getPackageName();
            if (targetPackage.equals(packageName)) {
                if (isPause) {
                    controller.getTransportControls().pause();
                    Log.d(TAG, "Paused: " + targetPackage);
                } else {
                    controller.getTransportControls().play();
                    Log.d(TAG, "Resumed: " + targetPackage);
                }
                return;
            }
        }
        Log.w(TAG, targetPackage + " is not active or not found");
    }
}

使用示例

在Activity或Fragment中直接调用工具类方法即可:

// 暂停Youtube Music
MusicControlHelper.pauseAppMusic(this, "com.google.android.apps.youtube.music");

// 恢复Android Music
MusicControlHelper.resumeAppMusic(this, "com.google.android.music");

注意事项

  • 权限动态申请:Android 13+ 需要动态申请POST_NOTIFICATIONS权限,否则无法正常控制媒体;部分设备可能需要额外申请MEDIA_CONTENT_CONTROL的动态权限。
  • 应用活跃性:只有当目标音乐应用处于活跃状态(正在播放或后台运行)时,才能找到对应的MediaController并执行控制操作。
  • 版本兼容:代码适配了Android Q及以上版本,低版本系统可能需要调整getActiveSessions的参数(可传入ComponentName,但通常null即可)。

内容的提问来源于stack exchange,提问作者learner coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:05:37