Sip对讲时蓝牙多次按键挂断导致ANR的问题解决

一、问题背景:
sip对讲时,希望通过蓝牙耳机进行接听、挂断操作。部分型号耳机在多次点击挂断按键时,经常出现anr异常
1 对比微信,微信语音过程中,点击蓝牙耳机,手机音频通道会切换到扬声器,并未走挂断流程;
2 部分耳机连接蓝牙进行微信语音中,点击耳机后自动切换手机音频通道至扬声器后,再次呼入,无法正常切换到SCO。


二、抓取日志,分析原因
2.1 philips耳机,挂断不会出现anr,抓取日志分析
接听
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12          connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2      Bluetooth SCO device connecting...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1      Bluetooth SCO device connected ...............


单次挂断
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10          Bluetooth audio device disconnected...............
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12          connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0      Bluetooth SCO device disconnected..........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2      Bluetooth SCO device connecting.........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1      Bluetooth SCO device connected.............
停留1-2秒
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10         Bluetooth audio device disconnected .............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0      Bluetooth SCO device disconnected


多次点击挂断测试1
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10          Bluetooth audio device disconnected...............
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12          connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0      Bluetooth SCO device disconnected..........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2      Bluetooth SCO device connecting.........................
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10         Bluetooth audio device disconnected .............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1      Bluetooth SCO device connected.............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0      Bluetooth SCO device disconnected

多次点击挂断测试2(与单次挂断表现一致)
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10          Bluetooth audio device disconnected...............
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12          connected...............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0      Bluetooth SCO device disconnected..........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2      Bluetooth SCO device connecting.........................
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1      Bluetooth SCO device connected.............
停留1-2秒
BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10         Bluetooth audio device disconnected .............
BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0      Bluetooth SCO device disconnected

2021-06-10 09:31:56.510 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
停留2秒
2021-06-10 09:32:07.678 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12
2021-06-10 09:32:07.679 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0
2021-06-10 09:32:07.679 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2
停留0.5秒
2021-06-10 09:32:07.679 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
2021-06-10 09:32:07.688 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1
2021-06-10 09:32:08.374 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0

2.2 Avantree耳机多次按键不正常
2021-06-10 09:36:30.317 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
停17秒导致未响应
2021-06-10 09:36:47.871 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 12
2021-06-10 09:36:47.877 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_AUDIO_STATE_CHANGED, onReceive: 10
2021-06-10 09:36:47.882 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0
2021-06-10 09:36:47.968 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 2
2021-06-10 09:36:50.024 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 1
2021-06-10 09:36:50.071 1293-1293/spon.rdc.new8531v D/BLETEST>>>: ACTION_SCO_AUDIO_STATE_UPDATED, onReceive: 0

2.3通过抓取日志分析,原因应该出现在Bluetooth这个apk里,挂断操作后,它会再次监听蓝牙状态,直至再次连接或者超时。


三、解决方法:
主要修改以下文件(由于裁减了电话应用,需要屏蔽processDialCall的处理)
package\apps\Bluetooth\src\com\android\bluetooth\hfp\HeadsetStateMachine.java
---
 .../bluetooth/hfp/HeadsetStateMachine.java    | 37 +++++++++++++++----
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
index 7517bea4d1..5dc4df2f6c 100755
--- a/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
+++ b/RK3399-JD4-Android7.1/packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java
@@ -361,7 +361,9 @@ final class HeadsetStateMachine extends StateMachine {
                     //          sends back events consistently
                     Message m = obtainMessage(CONNECT_TIMEOUT);
                     m.obj = device;
-                    sendMessageDelayed(m, 30000);
+                    //sendMessageDelayed(m, 30000);
+                     sendMessageDelayed(m, 6000);
+                    log("Howard sendMessageDelayed11 set 6000, old be: " + 30000);
                     break;
                 case DISCONNECT:
                     // ignore
@@ -766,7 +768,11 @@ final class HeadsetStateMachine extends StateMachine {
             // responded to, correctly.
             // we may enter Connected from Disconnected/Pending/AudioOn. listenForPhoneState
             // internally handles multiple calls to start listen
-            mPhoneState.listenForPhoneState(true);
+
+            log("Howard ,set false listen ,Enter Connected: " + getCurrentMessage().what +
+                           ", size: " + mConnectedDevicesList.size());
+            //mPhoneState.listenForPhoneState(true);//old be this
+            mPhoneState.listenForPhoneState(false);//howard test
         }
 
         @Override
@@ -841,6 +847,7 @@ final class HeadsetStateMachine extends StateMachine {
                     Message m = obtainMessage(CONNECT_TIMEOUT);
                     m.obj = device;
                     sendMessageDelayed(m, 30000);
+                    log("Howard sendMessageDelayed22: " + 30000);
                 }
                     break;
                 case DISCONNECT:
@@ -1277,6 +1289,7 @@ final class HeadsetStateMachine extends StateMachine {
                     Message m = obtainMessage(CONNECT_TIMEOUT);
                     m.obj = device;
                     sendMessageDelayed(m, 30000);
+                    log("Howard sendMessageDelayed33: " + 30000);
                 }
                 break;
                 case CONNECT_TIMEOUT:
@@ -2626,16 +2639,20 @@ final class HeadsetStateMachine extends StateMachine {
     }
 
     private void processHangupCall(BluetoothDevice device) {
         if(device == null) {
             Log.w(TAG, "processHangupCall device is null");
             return;
         }
-        Log.w(TAG, "===============》processHangupCall");
+        Log.w(TAG, "===============銆媝rocessHangupCall");
         // Close the virtual call if active. Virtual call should be
         // terminated for CHUP callback event
         if (isVirtualCallInProgress()) {
             terminateScoUsingVirtualVoiceCall();
-            Log.w(TAG, "===============》processHangupCall,isVirtualCallInProgress");
+            Log.w(TAG, "===============銆媝rocessHangupCall,isVirtualCallInProgress");
         } else {
             if (mPhoneProxy != null) {
                 try {
@@ -2650,6 +2667,9 @@ final class HeadsetStateMachine extends StateMachine {
     }
 
     private void processDialCall(String number, BluetoothDevice device) {
+        //howard disable it for exception
+        if(true)
+            return;
         if(device == null) {
             Log.w(TAG, "processDialCall device is null");
             return;
@@ -2973,8 +2993,8 @@ final class HeadsetStateMachine extends StateMachine {
                             "using IBluetoothHeadsetPhone proxy");
                         phoneNumber = "";
                     }
-                    clccResponseNative(1, 0, 0, 0, false, phoneNumber, type,
-                                                       getByteAddress(device));
+                    clccResponseNative(1, 0, 0, 0, false, phoneNumber, type, getByteAddress(device));
+                    Log.d(TAG, "Howard# CLCC   CLCC 00");
                     clccResponseNative(0, 0, 0, 0, false, "", 0, getByteAddress(device));
                 }
                 else if (!mPhoneProxy.listCurrentCalls()) {
@@ -2987,7 +3007,10 @@ final class HeadsetStateMachine extends StateMachine {
                                                                      + device);
                     Message m = obtainMessage(CLCC_RSP_TIMEOUT);
                     m.obj = getMatchingDevice(device);
-                    sendMessageDelayed(m, CLCC_RSP_TIMEOUT_VALUE);
+                    //howard disable
+                    //sendMessageDelayed(m, CLCC_RSP_TIMEOUT_VALUE);
+                    //howard added
+                    clccResponseNative(0, 0, 0, 0, false, "", 0, getByteAddress(device));
                 }
             } catch (RemoteException e) {
                 Log.e(TAG, Log.getStackTraceString(new Throwable()));

四、针对多次点击,会动切换手机音频通道至扬声器或后台播放音乐的问题, 需要屏蔽掉Music应用
diff --git a/RK3399-JD4-Android7.1/build/core/main.mk b/RK3399-JD4-Android7.1/build/core/main.mk
index b0207beec7..998d458776 100644
--- a/RK3399-JD4-Android7.1/build/core/main.mk
+++ b/RK3399-JD4-Android7.1/build/core/main.mk
@@ -760,6 +760,10 @@ ifdef FULL_BUILD
   # For the rest we add both
   product_MODULES += $(call get-32-bit-modules, $(modules_rest))
   product_MODULES += $(modules_rest)
+#added by howard to del apk
+product_sub_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEL_PACKAGES)
+product_MODULES := $(filter-out $(product_sub_MODULES), $(product_MODULES))
+
 
   $(call expand-required-modules,product_MODULES,$(product_MODULES))
 
diff --git a/RK3399-JD4-Android7.1/build/core/product.mk b/RK3399-JD4-Android7.1/build/core/product.mk
index 332b015fd8..e0661c6f45 100644
--- a/RK3399-JD4-Android7.1/build/core/product.mk
+++ b/RK3399-JD4-Android7.1/build/core/product.mk
@@ -124,6 +124,7 @@ _product_var_list := \
     PRODUCT_SYSTEM_BASE_FS_PATH \
     PRODUCT_VENDOR_BASE_FS_PATH \
     PRODUCT_SHIPPING_API_LEVEL \
+    PRODUCT_DEL_PACKAGES \  #add by howard for del apk
 
 
 
diff --git a/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk b/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk
index d834ead870..eed66f8646 100755
--- a/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk
+++ b/RK3399-JD4-Android7.1/device/rockchip/rk3399/rk3399.mk
@@ -52,3 +52,7 @@ PRODUCT_PACKAGES += \
     TelephonyProvider \
     MmsService
 
+#howard added
+PRODUCT_DEL_PACKAGES += \
+    Music    \
+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值