Android 8.0(API 级别 26)及以下版本
可以通过 AudioManager
的 registerAudioDeviceCallback
结合周期性检查 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 及以下:通过
AudioManager
的registerAudioDeviceCallback
监听音频设备的添加和移除事件,并结合周期性检查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)及以下版本
可以通过 AudioManager
的 registerAudioDeviceCallback
结合周期性检查 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 及以下:通过
AudioManager
的registerAudioDeviceCallback
监听音频设备的添加和移除事件,并结合周期性检查isMusicActive()
方法来判断音乐播放状态。 - Android 8.1 及以上:使用
MediaSessionManager
监听媒体会话的变化,通过检查MediaController
的播放状态来判断音乐是否正在播放。
权限说明
在 AndroidManifest.xml 中需要添加以下权限:
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
并且从 Android 6.0(API 级别 23)开始,需要在运行时请求此权限。