Android音视频知识之AudioManager类

前言

AudioManager类位于android.media包中,是一个功能强大的音频管理类,它提供了丰富的API来允许开发者对应用的音量和铃声模式进行控制以及访问。

AudioManager provides access to volume and ringer mode control.

获取实例

要使用AudioManager类,首先需要获取一个AudioManager实例,如下所示:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

然后我们就可以使用AudioManager实例来调用它提供的各种方法

主要功能和方法

设置和获取音频模式

  • setMode(int mode)设置音频模式
  • getMode()获取系统当前音频模式

音频模式的取值如下:

常量 说明
MODE_NORMAL 0 正常音频模式
MODE_RINGTONE 1 铃声模式
MODE_IN_CALL 2 呼叫模式
MODE_IN_COMMUNICATION 3 通话模式
MODE_CALL_SCREENING 4 呼叫锁屏模式
MODE_CALL_REDIRECT 5 呼叫重定向模式
MODE_COMMUNICATION_REDIRECT 6 通话重定向模式

设置和获取铃声模式

  • setRingerMode(int ringerMode)设置铃声模式
  • getRingerMode()获取系统当前铃声模式

铃声模式的取值如下:

//静音模式
public static final int RINGER_MODE_SILENT = 0;

//振动模式
public static final int RINGER_MODE_VIBRATE = 1;

//响铃模式
public static final int RINGER_MODE_NORMAL = 2;

输入/输出设备相关

  • getDevices(int flags),获取指定的设备列表
//获取输入设备列表
AudioDeviceInfo[] deviceInfoList = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);

//获取输出设备列表
AudioDeviceInfo[] deviceInfoList = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);

//获取输入和输出设备列表
AudioDeviceInfo[] deviceInfoList = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
  • setMicrophoneMute(boolean on),打开或关闭麦克风
  • isMicrophoneMute(),获取麦克风是否静音
  • setSpeakerphoneOn(boolean on),打开或关闭扬声器
  • isSpeakerphoneOn(),获取扬声器是否打开
  • startBluetoothSco(),开启蓝牙SCO连接,此方法可用于应用程序想要发送和接收音频到/从蓝牙SCO耳机
  • stopBluetoothSco(),停止蓝牙SCO连接
  • isBluetoothScoOn(),检查系统当前是否使用蓝牙SCO连接

音频焦点处理

请求音频焦点

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      AudioFocusRequest focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
           .setAudioAttributes(new AudioAttributes.Builder()
           .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
           .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
           .build())
           .setAcceptsDelayedFocusGain(true) //支持延迟获取焦点
           .build();
    int result = audioManager.requestAudioFocus(focusRequest);
    if (result == AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) {
        // 获取焦点成功,开始播放铃声
    } else {
        // 处理获取失败(如延迟获得焦点)
    }
} else {
    //兼容旧版本(API <26)的请求方式
   audioManager.requestAudioFocus(focusChangeListener, AudioManager.STREAM_RING, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
}

焦点类型选择:

  • AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:短暂独占焦点(适用于来电铃声,不允许其他应用播放)。

  • AUDIOFOCUS_GAIN:长期焦点(如音乐播放)。

  • AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:允许其他应用降低音量继续播放。

处理音频焦点变化

实现OnAudioFocusChangeListener以响应焦点变化:

AudioManager.OnAudioFocusChangeListener focusChangeListener = focusChange -> {
     switch (focusChange) {
          case AudioManager.AUDIOFOCUS_LOSS:
                // 永久失去焦点,停止播放并释放资源
                break;
          case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
          case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                // 暂时失去焦点:暂停播放(对于铃声通常选择暂停而非Ducking)
                break;
          case AudioManager.AUDIOFOCUS_GAIN:
               // 重新获得焦点:恢复播放
               break;
     }
};

释放音频焦点

private void releaseAudioFocus() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        audioManager.abandonAudioFocusRequest(focusRequest);
    } else {
        audioManager.abandonAudioFocus(focusChangeListener);
    }
}
posted @ 2025-04-29 15:00  南极冰川雪  阅读(277)  评论(0)    收藏  举报