Android音频开发:感应(息屏/亮屏)管理

Posted 红日666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android音频开发:感应(息屏/亮屏)管理相关的知识,希望对你有一定的参考价值。

一、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 源码

以上是关于Android音频开发:感应(息屏/亮屏)管理的主要内容,如果未能解决你的问题,请参考以下文章

Android音频开发:感应(息屏/亮屏)管理

Android音频开发:音频播放模式

Android音频开发:音频播放模式

Android音频开发:音频播放模式

Android音频开发:音频基础知识

Android音频开发:音频基础知识