[RK3288][Android6.0] AUDIO_BECOMING_NOISY作用

来源:互联网 发布:文件粉碎软件 编辑:程序博客网 时间:2024/06/05 10:34

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

系统中有个广播:

public static final String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";

它的作用是用来通知所有媒体播放应用程序声音将要从speaker播放了,因此大部分情况下应用程序就要暂停播放,以免声音从speaker播放从而影响到别人或者泄露隐私。

这个现象也可以从我们平常用有线耳机听歌时拔出耳机后音乐播放器暂停看到。

这种类似有限耳机的外设我们统称为安静外设。


实现:

拔出耳机时,会调用setWiredDeviceConnectionState():

        String caller) {    synchronized (mConnectedDevices) {        //检查是否要发送BecomingNoisy广播        int delay = checkSendBecomingNoisyIntent(type, state);        //耳机拔出处理,上面返回的delay决定对耳机拔出事件的处理延时。        queueMsgUnderWakeLock(mAudioHandler,                MSG_SET_WIRED_DEVICE_CONNECTION_STATE,                0,                0,                new WiredDeviceConnectionState(type, state, address, name, caller),                delay);    }}

checkSendBecomingNoisyIntent():

 private int checkSendBecomingNoisyIntent(int device, int state) {    int delay = 0;    //发送广播条件:外设被移除并且是安静外设列表之一,耳机的情况成立。    if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) {        int devices = 0;        //获取所有当前连接在系统上的安静外设        for (int i = 0; i < mConnectedDevices.size(); i++) {            int dev = mConnectedDevices.valueAt(i).mDeviceType;            if (((dev & AudioSystem.DEVICE_BIT_IN) == 0)                    && ((dev & mBecomingNoisyIntentDevices) != 0)) {                devices |= dev;            }        }        //相等就说明当前拔出的是最后一个安静外设了。        if (devices == device) {            //这时就要通过所有媒体播放程序当拔出外设后声音即将从speaker出来了。            sendMsg(mAudioHandler,                    MSG_BROADCAST_AUDIO_BECOMING_NOISY,                    SENDMSG_REPLACE,                    0,                    0,                    null,                    0);            //延时1S,足够应用程序处理上面的广播事件            delay = 1000;        }    } }

当应用程序如果正在播放时收到MSG_BROADCAST_AUDIO_BECOMING_NOISY这个广播,那么就应该暂停应用程序,因为在延时1s之后,系统将处理耳机拔出事件,如果继续播放,那么声音将从speaker出来了!

阅读全文
1 0