Android 开发监听是否正在播放音乐

Android 8.0(API 级别 26)及以下版本

可以通过 AudioManagerregisterAudioDeviceCallback 结合周期性检查 isMusicActive() 方法来监听音乐播放状态。不过 isMusicActive() 在 Android 8.1 及以上版本已被弃用。

示例代码
import android.content.Context;
import android.media.AudioDeviceCallback;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Looper;

public class MusicPlayListener {

    private AudioManager audioManager;
    private Handler handler;
    private boolean isMusicPlaying;
    private OnMusicPlayStateChangeListener listener;

    public MusicPlayListener(Context context, OnMusicPlayStateChangeListener listener) {
        this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        this.handler = new Handler(Looper.getMainLooper());
        this.listener = listener;
        startMonitoring();
    }

    private void startMonitoring() {
        audioManager.registerAudioDeviceCallback(new AudioDeviceCallback() {
            @Override
            public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
                checkMusicState();
            }

            @Override
            public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
                checkMusicState();
            }
        }, handler);

        // 定期检查音乐状态
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                checkMusicState();
                handler.postDelayed(this, 1000);
            }
        }, 1000);
    }

    private void checkMusicState() {
        boolean newState = audioManager.isMusicActive();
        if (newState != isMusicPlaying) {
            isMusicPlaying = newState;
            if (listener != null) {
                listener.onMusicPlayStateChanged(isMusicPlaying);
            }
        }
    }

    public interface OnMusicPlayStateChangeListener {
        void onMusicPlayStateChanged(boolean isPlaying);
    }
}
使用示例
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new MusicPlayListener(this, new MusicPlayListener.OnMusicPlayStateChangeListener() {
            @Override
            public void onMusicPlayStateChanged(boolean isPlaying) {
                if (isPlaying) {
                    Toast.makeText(MainActivity.this, "音乐开始播放", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "音乐停止播放", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

Android 8.1(API 级别 27)及以上版本

可以使用 MediaSessionManager 来监听媒体会话的变化,从而判断音乐是否正在播放。

示例代码
import android.content.Context;
import android.media.MediaSessionManager;
import android.media.session.MediaController;
import android.media.session.MediaSession;
import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import java.util.List;

public class MusicPlayMonitor {

    private MediaSessionManager mediaSessionManager;
    private OnMusicPlayStateChangeListener listener;
    private Handler handler;

    public MusicPlayMonitor(Context context, OnMusicPlayStateChangeListener listener) {
        this.mediaSessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
        this.listener = listener;
        this.handler = new Handler(Looper.getMainLooper());
        registerSessionListener();
    }

    private void registerSessionListener() {
        mediaSessionManager.addOnActiveSessionsChangedListener(new OnActiveSessionsChangedListener() {
            @Override
            public void onActiveSessionsChanged(List<MediaController> controllers) {
                checkMusicState(controllers);
            }
        }, null, handler);
    }

    private void checkMusicState(List<MediaController> controllers) {
        boolean isPlaying = false;
        for (MediaController controller : controllers) {
            MediaController.PlaybackInfo playbackInfo = controller.getPlaybackInfo();
            if (playbackInfo != null && playbackInfo.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
                MediaSession.Token token = controller.getSessionToken();
                MediaController mediaController = new MediaController(controller.getContext(), token);
                if (mediaController.getPlaybackState() != null && mediaController.getPlaybackState().getState() == MediaSession.PlaybackState.STATE_PLAYING) {
                    isPlaying = true;
                    break;
                }
            }
        }
        if (listener != null) {
            listener.onMusicPlayStateChanged(isPlaying);
        }
    }

    public interface OnMusicPlayStateChangeListener {
        void onMusicPlayStateChanged(boolean isPlaying);
    }
}
使用示例
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new MusicPlayMonitor(this, new MusicPlayMonitor.OnMusicPlayStateChangeListener() {
            @Override
            public void onMusicPlayStateChanged(boolean isPlaying) {
                if (isPlaying) {
                    Toast.makeText(MainActivity.this, "音乐开始播放", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "音乐停止播放", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

代码解释

  • Android 8.0 及以下:通过 AudioManagerregisterAudioDeviceCallback 监听音频设备的添加和移除事件,并结合周期性检查 isMusicActive() 方法来判断音乐播放状态。
  • Android 8.1 及以上:使用 MediaSessionManager 监听媒体会话的变化,通过检查 MediaController 的播放状态来判断音乐是否正在播放。

权限说明

在 AndroidManifest.xml 中需要添加以下权限:

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />

并且从 Android 6.0(API 级别 23)开始,需要在运行时请求此权限。 在 Android 开发中,监听是否正在播放音乐可以根据不同的 Android 版本采用不同的方法。以下为你详细介绍:

Android 8.0(API 级别 26)及以下版本

可以通过 AudioManagerregisterAudioDeviceCallback 结合周期性检查 isMusicActive() 方法来监听音乐播放状态。不过 isMusicActive() 在 Android 8.1 及以上版本已被弃用。

示例代码
import android.content.Context;
import android.media.AudioDeviceCallback;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Looper;

public class MusicPlayListener {

    private AudioManager audioManager;
    private Handler handler;
    private boolean isMusicPlaying;
    private OnMusicPlayStateChangeListener listener;

    public MusicPlayListener(Context context, OnMusicPlayStateChangeListener listener) {
        this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        this.handler = new Handler(Looper.getMainLooper());
        this.listener = listener;
        startMonitoring();
    }

    private void startMonitoring() {
        audioManager.registerAudioDeviceCallback(new AudioDeviceCallback() {
            @Override
            public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
                checkMusicState();
            }

            @Override
            public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
                checkMusicState();
            }
        }, handler);

        // 定期检查音乐状态
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                checkMusicState();
                handler.postDelayed(this, 1000);
            }
        }, 1000);
    }

    private void checkMusicState() {
        boolean newState = audioManager.isMusicActive();
        if (newState != isMusicPlaying) {
            isMusicPlaying = newState;
            if (listener != null) {
                listener.onMusicPlayStateChanged(isMusicPlaying);
            }
        }
    }

    public interface OnMusicPlayStateChangeListener {
        void onMusicPlayStateChanged(boolean isPlaying);
    }
}
使用示例
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new MusicPlayListener(this, new MusicPlayListener.OnMusicPlayStateChangeListener() {
            @Override
            public void onMusicPlayStateChanged(boolean isPlaying) {
                if (isPlaying) {
                    Toast.makeText(MainActivity.this, "音乐开始播放", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "音乐停止播放", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

Android 8.1(API 级别 27)及以上版本

可以使用 MediaSessionManager 来监听媒体会话的变化,从而判断音乐是否正在播放。

示例代码
import android.content.Context;
import android.media.MediaSessionManager;
import android.media.session.MediaController;
import android.media.session.MediaSession;
import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import java.util.List;

public class MusicPlayMonitor {

    private MediaSessionManager mediaSessionManager;
    private OnMusicPlayStateChangeListener listener;
    private Handler handler;

    public MusicPlayMonitor(Context context, OnMusicPlayStateChangeListener listener) {
        this.mediaSessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
        this.listener = listener;
        this.handler = new Handler(Looper.getMainLooper());
        registerSessionListener();
    }

    private void registerSessionListener() {
        mediaSessionManager.addOnActiveSessionsChangedListener(new OnActiveSessionsChangedListener() {
            @Override
            public void onActiveSessionsChanged(List<MediaController> controllers) {
                checkMusicState(controllers);
            }
        }, null, handler);
    }

    private void checkMusicState(List<MediaController> controllers) {
        boolean isPlaying = false;
        for (MediaController controller : controllers) {
            MediaController.PlaybackInfo playbackInfo = controller.getPlaybackInfo();
            if (playbackInfo != null && playbackInfo.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
                MediaSession.Token token = controller.getSessionToken();
                MediaController mediaController = new MediaController(controller.getContext(), token);
                if (mediaController.getPlaybackState() != null && mediaController.getPlaybackState().getState() == MediaSession.PlaybackState.STATE_PLAYING) {
                    isPlaying = true;
                    break;
                }
            }
        }
        if (listener != null) {
            listener.onMusicPlayStateChanged(isPlaying);
        }
    }

    public interface OnMusicPlayStateChangeListener {
        void onMusicPlayStateChanged(boolean isPlaying);
    }
}
使用示例
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new MusicPlayMonitor(this, new MusicPlayMonitor.OnMusicPlayStateChangeListener() {
            @Override
            public void onMusicPlayStateChanged(boolean isPlaying) {
                if (isPlaying) {
                    Toast.makeText(MainActivity.this, "音乐开始播放", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "音乐停止播放", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

代码解释

  • Android 8.0 及以下:通过 AudioManagerregisterAudioDeviceCallback 监听音频设备的添加和移除事件,并结合周期性检查 isMusicActive() 方法来判断音乐播放状态。
  • Android 8.1 及以上:使用 MediaSessionManager 监听媒体会话的变化,通过检查 MediaController 的播放状态来判断音乐是否正在播放。

权限说明

在 AndroidManifest.xml 中需要添加以下权限:

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />

并且从 Android 6.0(API 级别 23)开始,需要在运行时请求此权限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值