[FAQ19142]VOIP APK与普通电话交互导致普通电话无声

来源:互联网 发布:淘宝突然登不上去了 编辑:程序博客网 时间:2024/05/17 01:31
[DESCRIPTION]
 先进行What's APP通话,然后普通电话来电接听,再返回What's APP界面,普通电话无声,What's APP声音恢复
 正常来说普通电话应该比What's APP重要,普通电话时不应该允许恢复VOIP电话
 
 
 
[SOLUTION]
 
 在AudioService.java setMode()接口中增加相关判断,如果当前是普通电话模式时,则不允许切换到VOIP Mode
 具体Code修改如下:

public void setMode(int mode, IBinder cb) {

        if (DEBUG_MODE) { Log.v(TAG, "setMode(mode=" + mode + ")"); }

        if (!checkAudioSettingsPermission("setMode()")) {

            if (DEBUG_VOL) Log.e(TAG, "setMode: No permission!");

            return;

        }

       

        //AAAA Add begin

        if((mode == AudioSystem.MODE_IN_COMMUNICATION) && ( (mMode == AudioSystem.MODE_IN_CALL) || (mMode == AudioSystem.MODE_IN_CALL_2)))

        {

            Log.w(TAG, "MODIFY_PHONE_STATE Permission Denial: Current mode is in call");

            return;

        }

        //AAAA Add end

 

        if ( (mode == AudioSystem.MODE_IN_CALL) &&

                (mContext.checkCallingOrSelfPermission(

                        android.Manifest.permission.MODIFY_PHONE_STATE)

                            != PackageManager.PERMISSION_GRANTED)) {

            Log.w(TAG, "MODIFY_PHONE_STATE Permission Denial: setMode(MODE_IN_CALL) from pid="

                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid());

            return;

        }

 

        if (mode < AudioSystem.MODE_CURRENT || mode >= AudioSystem.NUM_MODES) {

            if (DEBUG_VOL) Log.e(TAG, "setMode: Invalid mode!");

            return;

        }

 

    //#ifdef VENDOR_EDIT

    //Yujie.Wei@EXp.GeneralApp.audio. 2016/03/16, add for judge whether voip call

    Intent broadcast = new Intent("android.media.OPPO_VOIP");

    if(AudioManager.MODE_IN_COMMUNICATION == mode) {

                broadcast.putExtra("android.media.OPPO_VOIP_EXTRA", 1);

    }

    else{

                broadcast.putExtra("android.media.OPPO_VOIP_EXTRA", 0);

    }

    sendBroadcastToAll(broadcast);

    //#endif /* VENDOR_EDIT */

        int newModeOwnerPid = 0;

        synchronized(mSetModeDeathHandlers) {

            if (mode == AudioSystem.MODE_CURRENT) {

                mode = mMode;

            }

            newModeOwnerPid = setModeInt(mode, cb, Binder.getCallingPid());

        }

        // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all

        // SCO connections not started by the application changing the mode

        if (newModeOwnerPid != 0) {

             disconnectBluetoothSco(newModeOwnerPid);

        }

    }

0 0
原创粉丝点击