一、Android音频开发(一):音频基础知识
二、Android音频开发(二):录制音频(WAV及MP3格式)
三、Android音频开发(三):使用ExoPlayer播放音频
四、Android音频开发(四):音频播放模式
五、Android音频开发(五):感应(息屏/亮屏)管理
附GitHub源码:MultimediaExplore
这节主要涉及到两部分音频管理:
1、息/亮屏管理:
屏幕管理,主要涉及的音频应用场景有,如录制或播放音频时刻控制其不息屏,或者通过监听息屏亮屏事件,我们针对性的控制音频的存储、发送、播放等操作。
所需权限:
<!--唤屏/息屏权限-->
<uses-permission android:name="android.Manifest.permission.DEVICE_POWER"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
主要用到的系统的 PowerManager 及 PowerManager.WakeLock类。
powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, ":SensorMode");
/**
* 设置亮屏时间
*/
private void setScreenOn() {
if (wakeLock != null) {
wakeLock.acquire(10*60*1000L);
}
}
/**
* 设置息屏
*/
private void setScreenOff() {
if (wakeLock != null) {
wakeLock.setReferenceCounted(false);
wakeLock.release();
wakeLock = null;
}
}
息屏/亮屏的事件,也是通过系统广播来监听:
/* 注册屏幕唤醒时的广播 */
IntentFilter mScreenOnFilter = new IntentFilter("android.intent.action.SCREEN_ON");
context.registerReceiver(mScreenOReceiver, mScreenOnFilter);
/* 注册机器锁屏时的广播 */
IntentFilter mScreenOffFilter = new IntentFilter("android.intent.action.SCREEN_OFF");
context.registerReceiver(mScreenOReceiver, mScreenOffFilter);
/**
* 唤屏 / 息屏广播监听者
*/
private BroadcastReceiver mScreenOReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("android.intent.action.SCREEN_ON")) {
Log.d(TAG, "—— SCREEN_ON ——");
if (screenListener != null) {
screenListener.screenChanged(true);
}
} else if (action.equals("android.intent.action.SCREEN_OFF")) {
Log.d(TAG ,"—— SCREEN_OFF ——");
if (screenListener != null) {
screenListener.screenChanged(false);
}
}
}
};
通过以上接收到的广播,我们便可以添加自己所需的 息屏/亮屏 相关的业务逻辑。
2、感应管理:
感应管理,主要是使用者体表对手机的距离感应监听,来进行相关的音频业务操作,比如用户面部贴近手机听筒,这个时候可以考虑息屏,且播放模式切换成听筒模式;远离手机听筒,此时手机亮屏,播放模式可以切换成外放模式等。
这里主要用到系统的两个类、一个监听:SensorManager 、Sensor 和 SensorEventListener:
首先对其初始化操作如下:
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
然后通过距离监听,做相应的音频业务处理即可:
/**
* 距离感应监听
* @param event
*/
@Override
public void onSensorChanged(SensorEvent event) {
float value = event.values[0];
Log.d(TAG, "onSensorChanged ---> value:" + value);
if (AudioPlayManager.isPlaying()) {
//音频正在播放
if (value == sensor.getMaximumRange()) {
AudioModeManager.getInstance().setSpeakerOn(true);
setScreenOn();
} else {
AudioModeManager.getInstance().setSpeakerOn(false);
setScreenOff();
}
} else {
if (value == sensor.getMaximumRange()) {
AudioModeManager.getInstance().setSpeakerOn(true);
setScreenOn();
}
}
}
完整源码:
音频感应模式管理类-SensorModeManager 源码: