基于AudioManager实现的音频控制器
.
介绍
如果我们想对
Android
系统中各种音频进行控制,那我们可以通过**AudioManager
**(音频管理器)类提供的方法来实现,该类提供了各种音量控制与设置铃声模式相关操作,并且可以对麦克风以及音频焦点进行管理和监听等等。
.
.
AudioManager的常用方法
.
1. 音量控制相关的方法:
- getStreamMaxVolume(streamType):
作用: 获取
streamType
对应类型的最大音量值
- getStreamVolume(streamType):
作用: 获取
streamType
对应类型的当前音量,当设置为0的时候,会自动调整为震动模式
- adjustStreamVolume(streamType, direction,flags):
作用: 根据不同的
streamType
类型,调整手机指定类型的声音streamType类型如下:
STREAM_ALARM
:表示手机闹铃的声音STREAM_DTMF
:表示DTMF音调的声音STREAM_MUSIC
:表示手机媒体声音STREAM_NOTIFICATION
:表示系统提示的声音STREAM_RING
:表示电话铃声的声音STREAM_SYSTEM
:表示手机系统的声音STREAM_VOICE_CALL
:表示语音电话的声音
- setStreamVolume (streamType,index,flags):
作用: 直接设置手机的指定类型的音量值。其中
streamType
参数与adjustStreamVolume()
方法中第一个参数的意义相同
- setStreamMute(streamType,state):
作用: 将手机的指定类型的声音调整为静音。其中
streamType
参数与adjustStreamVolume()
方法中第一个参数的意义相同
.
2. 铃声与通话相关的方法:
- getMode():
作用: 获取当前的音频模式
- setMode(mode):
作用: 设置声音模式。可设置的值有
NORMAL
,RINGTONE
, 和IN_CALL
- getRingerMode():
作用: 获取当前的铃声模式
- setRingerMode(ringerMode):
作用: 设置手机电话铃声的模式
ringerMode类型如下:
RINGER_MODE_NORMAL
:正常的手机铃声RINGER_MODE_SILENT
:手机铃声静音RINGER_MODE_VIBRATE
:手机震动
- setSpeakerphoneOn(boolean on):
作用: 设置扬声器打开或关闭。设置为
true
开启免提通话;false
关闭免提
- isMicrophoneMute():
- 作用: 判断麦克风是否静音或是否打开
- setMicrophoneMute(boolean on):
作用: 设置是否让麦克风静音。设置为
true
将麦克风静音;false
关闭静音
.
3. 音频设置相关的方法:
- isMusicActive():
作用: 判断是否有音乐处于活跃状态
- requestAudioFocus(AudioManager.OnAudioFocusChangeListener,streamType,durationHint):
作用: 请求音频的焦点
- abandonAudioFocus(AudioManager.OnAudioFocusChangeListener):
作用: 放弃音频的焦点
- loadSoundEffects():
作用: 加载声音效果
- playSoundEffect(effectType,volume):
作用: 播放声音效果
- unloadSoundEffects():
作用: 卸载音效
- setStreamSolo(streamType,state):
作用: 设置独奏或来取消特定流
- isWiredHeadsetOn():
作用: 判断是否插入了耳机
.
.
基于AudioManager音频控制器的实现
.
效果图:
.
1. 在AndroidManifest.xml
中注册权限
<!-- 授予程序访问振动器的权限 -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
.
2. 获得AudioManager对象实例
//震动管理器
private Vibrator vibrator;
//音量管理器
private AudioManager audioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) getApplicationContext().getSystemService
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
}
.
3. 调用 AudioManager中的方法实现具体功能
.
4. 监听物理音量按键
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.i("萝莉","="+keyCode);
mediaCurVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
if (mediaCurVolume < mediaMaxVolume) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaCurVolume + 1, 0);
sb_media_audio.setProgress(mediaCurVolume + 1);
} else {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaMaxVolume, 0);
sb_media_audio.setProgress(mediaMaxVolume);
}
setVibrator();
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (mediaCurVolume > 0) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mediaCurVolume - 1, 0);
sb_media_audio.setProgress(mediaCurVolume - 1);
} else {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
sb_media_audio.setProgress(0);
}
setVibrator();
return true;
}
return super.onKeyDown(keyCode, event);
}
.
.
实现的完整代码如下:
.
1. 布局代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:id="@+id/container_ball_menu_detail_voice"
android:layout_width="240dp"
android:layout_height="240dp"
android:background="@drawable/shape_react_corners_top_menu_bg"
android:padding="3dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf=