为了能够收听所有音量流,对我来说最好的方法是使用 ContentObserver。这是我的代码:
public class AudioVolumeObserver
{
public interface OnAudioStreamVolumeChangedListener
{
void onAudioStreamVolumeChanged(ArrayList<Integer> audioStreamType);
}
public interface OnAudioModeVolumeChangedListener
{
void onAudioModeVolumeChanged(int volumeMode);
}
private static class AudioVolumeContentObserver
extends ContentObserver
{
private final AudioManager mAudioManager;
private final OnAudioStreamVolumeChangedListener mVolumeStreamListener;
private final OnAudioModeVolumeChangedListener mVolumeModeListener;
private int[] currentVolumeStreams = new int[6];
private int[] lastVolumeStreams = new int[6];
private int currentVolumeMode;
private int lastVolumeMode;
ArrayList<Integer> changedVolumeStreams = new ArrayList<>();
public AudioVolumeContentObserver(
@NonNull
Handler handler,
@NonNull
AudioManager audioManager,
@NonNull
OnAudioModeVolumeChangedListener volumeModeListener,
@NonNull
OnAudioStreamVolumeChangedListener volumeStreamListener)
{
super(handler);
mAudioManager = audioManager;
mVolumeModeListener = volumeModeListener;
mVolumeStreamListener = volumeStreamListener;
lastVolumeMode = mAudioManager.getRingerMode();
lastVolumeStreams[0] = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
lastVolumeStreams[1] = mAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);
lastVolumeStreams[2] = mAudioManager.getStreamVolume(AudioManager.STREAM_RING);
lastVolumeStreams[3] = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
lastVolumeStreams[4] = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);
lastVolumeStreams[5] = mAudioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION);
}
@Override
public void onChange(boolean selfChange)
{
currentVolumeMode = mAudioManager.getRingerMode();
currentVolumeStreams[0] = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
currentVolumeStreams[1] = mAudioManager.getStreamVolume(AudioManager.STREAM_SYSTEM);
currentVolumeStreams[2] = mAudioManager.getStreamVolume(AudioManager.STREAM_RING);
currentVolumeStreams[3] = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
currentVolumeStreams[4] = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);
currentVolumeStreams[5] = mAudioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION);
if (currentVolumeMode != lastVolumeMode){
lastVolumeMode = currentVolumeMode;
mVolumeModeListener.onAudioModeVolumeChanged(currentVolumeMode);
}
changedVolumeStreams.clear();
for (int i=0; i<6; i++)
if (currentVolumeStreams[i] != lastVolumeStreams[i])
{
lastVolumeStreams[i] = currentVolumeStreams[i];
changedVolumeStreams.add(i);
}
if (!changedVolumeStreams.isEmpty()){
mVolumeStreamListener.onAudioStreamVolumeChanged(changedVolumeStreams);
}
}
}
private final Context mContext;
private AudioVolumeContentObserver mAudioVolumeContentObserver;
public AudioVolumeObserver(
@NonNull
Context context)
{
mContext = context;
}
public void start(@NonNull
OnAudioModeVolumeChangedListener volumeModeListener,
@NonNull
OnAudioStreamVolumeChangedListener volumeStreamListener)
{
stop();
Handler handler = new Handler();
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mAudioVolumeContentObserver = new AudioVolumeContentObserver(handler, audioManager, volumeModeListener, volumeStreamListener);
mContext.getContentResolver()
.registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mAudioVolumeContentObserver);
}
public void stop()
{
if (mAudioVolumeContentObserver == null)
{
return;
}
mContext.getContentResolver()
.unregisterContentObserver(mAudioVolumeContentObserver);
mAudioVolumeContentObserver = null;
}
}