一、Android音頻開發(一):音頻基礎知識
二、Android音頻開發(二):錄制音頻(WAV及MP3格式)
三、Android音頻開發(三):使用ExoPlayer播放音頻
四、Android音頻開發(四):音頻播放模式
五、Android音頻開發(五):感應(息屏/亮屏)管理
附GitHub原始碼:MultimediaExplore
音頻播放模式主要有:
1、耳機模式 2、外放模式 3、聽筒模式
音頻播放模式所需權限:
<!--音頻模式切換權限-->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
通過系統自帶的 AudioManager 管理類來進行播放模式的切換,使用之前我們需初始化該類:
AudioManager audioManager = (AudioManager)appContext.getSystemService(Context.AUDIO_SERVICE);
然后設定其相應播放模式:
/**
* 切換到外放
*/
private void changeToSpeaker() {
if (audioManager != null) {
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);
}
}
/**
* 切換到耳機模式
*/
private void changeToHeadset() {
if (audioManager != null) {
audioManager.setSpeakerphoneOn(false);
}
}
/**
* `
* 切換到聽筒
*/
private void changeToReceiver() {
if (audioManager != null) {
audioManager.setSpeakerphoneOn(false);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
}
}
這里注意一點的是,我們需要監聽耳機(包含有線耳機 / 藍牙耳機)的插拔操作,系統專門的廣播通知,我們需要注冊監聽廣播如下:
//監聽有線耳機
intentFilter.addAction(Intent.ACTION_HEADSET_PLUG);
intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
//監聽藍牙耳機
intentFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
//注冊監聽耳機的插拔
appContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive -- 耳機");
String action = intent.getAction();
if (Objects.requireNonNull(action).equals(Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", 0);
Log.d(TAG, "state:" + state);
if (state == 1) {
Log.d(TAG, "有線耳機插入");
playMode = PlayMode.Headset;
changeMode(playMode);
} else if (state == 0) {
Log.d(TAG, "有線耳機拔出");
if (isSpeakerOn()) {
playMode = PlayMode.Speaker;
} else {
playMode = PlayMode.Receiver;
}
changeMode(playMode);
}
} else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
//此處 有線/藍牙拔出狀態應該均能監聽到
Log.d(TAG, "有線耳機拔出");
} else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
switch (state) {
case BluetoothProfile.STATE_CONNECTED:
Log.d(TAG, "藍牙耳機連接");
playMode = PlayMode.Headset;
changeMode(playMode);
break;
case BluetoothProfile.STATE_DISCONNECTED:
Log.d(TAG, "藍牙耳機斷開");
if (isSpeakerOn()) {
playMode = PlayMode.Speaker;
} else {
playMode = PlayMode.Receiver;
}
changeMode(playMode);
break;
}
}
}
}, intentFilter);
如上代碼所示,根據需要的監聽,自行添加即可,
另外,播放語音時還會涉及到與第三方音樂播放器音頻焦點的搶奪:
/**
* 播放時語音時 呼叫該方法 屏蔽第三方音樂 同時使當前播放模式生效
*/
audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
/**
* 語音停止播放時 呼叫該方法 恢復第三方音樂播放 恢復播放模式
*/
audioManager.abandonAudioFocus(null);
另外,也可以結合APP前后臺操作的監聽,來控制當前音頻的播放跟暫停等,
完整原始碼:
音頻播放模式管理類-AudioModeManager原始碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374825.html
標籤:其他
上一篇:百度地圖定位
