当前位置: 首页 > news >正文

通话状态监听-Android13

通话状态监听-Android13

  • 1、Android Telephony 模块结构
  • 2、监听和广播获取通话状态
    • 2.1 注册
    • 2.2 通话状态通知
    • 2.3 通话状态
  • 3、通知状态流程
  • * 关键日志

frameworks/base/core/java/android/telephony/PhoneStateListener.java


1、Android Telephony 模块结构

Android Telephony 模块结构简析
Android Telephony 模块结构简析
Telecom 框架概览

  • Dialer.apk: /product/priv-app/Dialer/Dialer.apk、packages/apps/Dialer
  • Telecom.apk: /system/priv-app/Telecom/Telecom.apk、packages/service/telecomm
  • TeleService.apk: /system/priv-app/TeleService/TeleService.apk、packages/service/telephony

  • framework.jar: frameworks/base/telecomm、frameworks/base/telephony

  • telephony-common.jar: frameworks/opt/telephony

  • vendor.ril-daemon: hardware/ril

2、监听和广播获取通话状态

主要查看 framework.jar 代码

2.1 注册

    1. PhoneStateListener注册:最终调用TelephonyRegistry.java#listenWithEventList添加到ArrayList<Record> mRecords
      packages/apps/Dialer/java/com/android/incallui/InCallPresenter.java
this.context.getSystemService(TelephonyManager.class).listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
    1. 广播注册:public static final String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE";,权限android.permission.READ_PHONE_STATE
      packages/apps/Dialer/java/com/android/dialer/dialpadview/DialpadFragment.java
    if (callStateReceiver == null) {IntentFilter callStateIntentFilter =new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);callStateReceiver = new CallStateReceiver();getActivity().registerReceiver(callStateReceiver, callStateIntentFilter);}
/private class CallStateReceiver extends BroadcastReceiver {/*** Receive call state changes so that we can take down the "dialpad chooser" if the phone* becomes idle while the chooser UI is visible.*/@Overridepublic void onReceive(Context context, Intent intent) {String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);if ((TextUtils.equals(state, TelephonyManager.EXTRA_STATE_IDLE)|| TextUtils.equals(state, TelephonyManager.EXTRA_STATE_OFFHOOK))&& isDialpadChooserVisible()) {// Note there's a race condition in the UI here: the// dialpad chooser could conceivably disappear (on its// own) at the exact moment the user was trying to select// one of the choices, which would be confusing.  (But at// least that's better than leaving the dialpad chooser// onscreen, but useless...)LogUtil.i("CallStateReceiver.onReceive", "hiding dialpad chooser, state: %s", state);showDialpadChooser(false);}}}

2.2 通话状态通知

frameworks/base/services/core/java/com/android/server/TelephonyRegistry.java

    public void notifyCallState(int phoneId, int subId, int state, String incomingNumber) {if (!checkNotifyPermission("notifyCallState()")) {return;}if (VDBG) {log("notifyCallState: subId=" + subId+ " state=" + state + " incomingNumber=" + incomingNumber);}synchronized (mRecords) {if (validatePhoneId(phoneId)) {mCallState[phoneId] = state;mCallIncomingNumber[phoneId] = incomingNumber;for (Record r : mRecords) {if (r.matchTelephonyCallbackEvent(TelephonyCallback.EVENT_LEGACY_CALL_STATE_CHANGED)&& (r.subId == subId)&& (r.subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) {try {// Only the legacy PhoneStateListener receives the phone number.String incomingNumberOrEmpty = getCallIncomingNumber(r, phoneId);r.callback.onLegacyCallStateChanged(state, incomingNumberOrEmpty);} catch (RemoteException ex) {mRemoveList.add(r.binder);}}if (r.matchTelephonyCallbackEvent(TelephonyCallback.EVENT_CALL_STATE_CHANGED)&& (r.subId == subId)&& (r.subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) {try {// The phone number is not included in the new call state changed// listener.r.callback.onCallStateChanged(state);} catch (RemoteException ex) {mRemoveList.add(r.binder);}}}}handleRemoveListLocked();}broadcastCallStateChanged(state, incomingNumber, phoneId, subId);}

2.3 通话状态

frameworks/base/telephony/java/android/telephony/TelephonyManager.java

CALL_STATE_IDLE: 处于无电话活动,相当于电话挂断,不过要先有CALL_STATE_OFFHOOK判断
CALL_STATE_RINGING: 电话响铃
CALL_STATE_OFFHOOK: 接听电话

    /*** Device call state: No activity.*/public static final int CALL_STATE_IDLE = 0;/*** Device call state: Ringing. A new call arrived and is*  ringing or waiting. In the latter case, another call is*  already active.*/public static final int CALL_STATE_RINGING = 1;/*** Device call state: Off-hook. At least one call exists* that is dialing, active, or on hold, and no calls are ringing* or waiting.*/public static final int CALL_STATE_OFFHOOK = 2;

3、通知状态流程

frameworks/base/core/java/android/telephony/TelephonyRegistryManager.java
frameworks/base/services/core/java/com/android/server/TelephonyRegistry.java

在这里插入图片描述

    public void notifyCallStateForAllSubs(int state, String phoneNumber) {if (!checkNotifyPermission("notifyCallState()")) {return;}if (VDBG) {log("notifyCallStateForAllSubs: state=" + state + " phoneNumber=" + phoneNumber);}synchronized (mRecords) {for (Record r : mRecords) {if (r.matchTelephonyCallbackEvent(TelephonyCallback.EVENT_LEGACY_CALL_STATE_CHANGED)&& (r.subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) {try {// Ensure the listener has read call log permission; if they do not return// an empty phone number.// This is ONLY for legacy onCallStateChanged in PhoneStateListener.String phoneNumberOrEmpty = r.canReadCallLog() ? phoneNumber : "";r.callback.onLegacyCallStateChanged(state, phoneNumberOrEmpty);} catch (RemoteException ex) {mRemoveList.add(r.binder);}}if (r.matchTelephonyCallbackEvent(TelephonyCallback.EVENT_CALL_STATE_CHANGED)&& (r.subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) {try {// The new callback does NOT provide the phone number.r.callback.onCallStateChanged(state);} catch (RemoteException ex) {mRemoveList.add(r.binder);}}}handleRemoveListLocked();}// Called only by Telecomm to communicate call state across different phone accounts. So// there is no need to add a valid subId or slotId.broadcastCallStateChanged(state, phoneNumber,SubscriptionManager.INVALID_SIM_SLOT_INDEX,SubscriptionManager.INVALID_SUBSCRIPTION_ID);}public void notifyCallState(int phoneId, int subId, int state, String incomingNumber) {if (!checkNotifyPermission("notifyCallState()")) {return;}if (VDBG) {log("notifyCallState: subId=" + subId+ " state=" + state + " incomingNumber=" + incomingNumber);}synchronized (mRecords) {if (validatePhoneId(phoneId)) {mCallState[phoneId] = state;mCallIncomingNumber[phoneId] = incomingNumber;for (Record r : mRecords) {if (r.matchTelephonyCallbackEvent(TelephonyCallback.EVENT_LEGACY_CALL_STATE_CHANGED)&& (r.subId == subId)&& (r.subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) {try {// Only the legacy PhoneStateListener receives the phone number.String incomingNumberOrEmpty = getCallIncomingNumber(r, phoneId);r.callback.onLegacyCallStateChanged(state, incomingNumberOrEmpty);} catch (RemoteException ex) {mRemoveList.add(r.binder);}}if (r.matchTelephonyCallbackEvent(TelephonyCallback.EVENT_CALL_STATE_CHANGED)&& (r.subId == subId)&& (r.subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) {try {// The phone number is not included in the new call state changed// listener.r.callback.onCallStateChanged(state);} catch (RemoteException ex) {mRemoveList.add(r.binder);}}}}handleRemoveListLocked();}broadcastCallStateChanged(state, incomingNumber, phoneId, subId);}

* 关键日志

 ril.*GET_CURRENT_CALLS|TelephonyManager:|PhoneStateListener:|TelecomFramework: TelephonyConnectionService:|TelephonyMetrics:|Telecom : CallsManager|Telecom : PhoneStateBroadcaster: Broadcasted state change:|Telephony: onStateChanged|android.intent.action.PHONE_STATE|KeyguardUpdateMonitor:|notification_enqueue.*com.google.android.dialer|Dialer  :.*CallState
12-17 21:06:43.523   957   957 D RILJ    : [1066]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:43.524   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:43.529   957  1274 D RILJ    : [1066]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:43.546   957   957 E TelephonyMetrics: writePhoneState: Call session is missing
12-17 21:06:43.676   957   957 I TelecomFramework: TelephonyConnectionService: createConnection, callManagerAccount: ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, callId: TC@4_1, request: ConnectionRequest xxxxxxxxxxxxxx Bundle[android.telecom.extra.INCOMING_CALL_ADDRESS=***, android.telecom.extra.CALL_CREATED_TIME_MILLIS=68867006, android.telecom.extra.CALL_TELECOM_ROUTING_START_TIME_MILLIS=68867038, ] isAdhocConf: N, isIncoming: true, isUnknown: false, isLegacyHandover: false, isHandover: false,  addSelfManaged: true: (SBC.oSC)->CS.crCo->H.CS.crCo->H.CS.crCo.pICR(cap/cast)@E-Ajo
12-17 21:06:43.683   957   957 V Telephony: onStateChanged, state: RINGING
12-17 21:06:43.718   957   957 I TelecomFramework: TelephonyConnectionService: notifyCreateConnectionComplete TC@4_1: (...->CSW.hCCC)->CS.crCoC->H.CS.crCoC(cap/cast)@E-E-E-Ajo
12-17 21:06:43.780   596 10440 I Telecom : CallsManager: onCallFilteringComplete: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF(cap/cast)@E-E-Ajo
12-17 21:06:43.781   596 10440 I Telecom : CallsManager: setCallState NEW -> RINGING, call: [Call id=TC@4, state=NEW, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, handle=tel:********12, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a spd_aud], prop=[]], voip=false: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF(cap/cast)@E-E-Ajo
12-17 21:06:43.786   596 10440 I Telecom : CallsManager: onCallFilteringComplete: allow call.: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF(cap/cast)@E-E-Ajo
12-17 21:06:43.786   596 10440 I Telecom : CallsManager: addCall([Call id=TC@4, state=RINGING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, handle=tel:********12, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a spd_aud], prop=[]], voip=false): (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF(cap/cast)@E-E-Ajo
12-17 21:06:43.797   957   957 I TelecomFramework: TelephonyConnectionService: onCallFilteringCompleted(TC@4_1, CallFilteringCompletionInfo{mIsBlocked=false, mIsInContacts=false, mCallResponse=null, mCallScreeningPackageName='null'}): (...->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF)->CS.oCFC->H.CS.oCFC(cap/cast/cast)@E-E-E-Ajo
12-17 21:06:43.879   596 10440 I Telecom : PhoneStateBroadcaster: Broadcasted state change: 1: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF(cap/cast)@E-E-Ajo
12-17 21:06:43.898   957   957 I TelecomFramework: TelephonyConnectionService: onTrackedByNonUiService TC@4_1 true: (ICSBC.oSC)->CS.tBNUS->H.CS.tBNUS(cad/cast)@E-Ajw
12-17 21:06:44.038   957   957 D RILJ    : [1068]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:44.039   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:44.049   957  1274 D RILJ    : [1068]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:44.113   957   957 I TelecomFramework: TelephonyConnectionService: onTrackedByNonUiService TC@4_1 true: (ICSBC.oSC)->CS.tBNUS->H.CS.tBNUS(cab/cast)@E-Aj8
12-17 21:06:44.132   957   957 I TelecomFramework: TelephonyConnectionService: onAudioStateChanged TC@4_1 [AudioState isMuted: false, route: SPEAKER, supportedRouteMask: SPEAKER, activeBluetoothDevice: [null], supportedBluetoothDevices: []]: (...->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->CARSM.pM_UPDATE_SYSTEM_AUDIO_ROUTE)->CS.cASC->H.CS.cASC(cap/cast/cast)@E-E-E-Ajo
12-17 21:06:44.326   957   957 I TelecomFramework: TelephonyConnectionService: onAudioStateChanged TC@4_1 [AudioState isMuted: false, route: SPEAKER, supportedRouteMask: SPEAKER, activeBluetoothDevice: [null], supportedBluetoothDevices: []]: (...->CSW.hCCC->ICFG.sF->ICFG.sF->ICFG.sF->CILH.sL->CILH.oQC->BCF.gBS->BCF.gBS->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->ICFG.sF->CAMSM.pM_2002->CARSM.pM_SWITCH_FOCUS)->CS.cASC->H.CS.cASC(cap/cast/cast)@E-E-E-Ajo
12-17 21:06:44.551   957   957 D RILJ    : [1070]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:44.551   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:44.562   957  1273 D RILJ    : [1070]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:45.075   957   957 D RILJ    : [1072]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:45.076   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:45.081   957  1273 D RILJ    : [1072]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:45.594   957   957 D RILJ    : [1074]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:45.594   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:45.597   957  1273 D RILJ    : [1074]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:46.109   957   957 D RILJ    : [1076]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:46.109   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:46.115   957  1273 D RILJ    : [1076]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:46.626   957   957 D RILJ    : [1078]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:46.626   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:46.629   957  1273 D RILJ    : [1078]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:47.137   957   957 D RILJ    : [1080]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:47.138   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:47.142   957  1273 D RILJ    : [1080]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:47.651   957   957 D RILJ    : [1082]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:47.651   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:47.655   957  1273 D RILJ    : [1082]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:48.164   957   957 D RILJ    : [1084]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:48.164   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:48.174   957  1273 D RILJ    : [1084]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:48.682   596  9194 I Telecom : CallsManager: holdActiveCallForNewCall, newCall: [Call id=TC@4, state=RINGING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, handle=tel:********12, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a spd_aud], prop=[]], voip=false, activeCall: null: ICA.aC(cad)@Ak4
12-17 21:06:48.706   957   957 D RILJ    : [1086]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:48.707   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:48.716   957  1273 D RILJ    : [1086]< GET_CURRENT_CALLS {[id=4,INCOMING,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:48.745   957   957 I TelecomFramework: TelephonyConnectionService: answer TC@4_1: (ICA.aC->CSFM.rF)->CS.an->H.CS.an(cad/cast)@E-Ak4
12-17 21:06:48.760   596  1157 I Telecom : CallsManager: setCallState RINGING -> ANSWERED, call: [Call id=TC@4, state=RINGING, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, handle=tel:********12, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a spd_aud], prop=[]], voip=false: ICA.aC->CSFM.rF(cad)@Ak4
12-17 21:06:48.910   957   957 D RILJ    : [1089]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:48.912   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:48.957   957  1273 D RILJ    : [1089]< GET_CURRENT_CALLS {[id=4,ACTIVE,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:49.078   957   957 V Telephony: onStateChanged, state: ACTIVE
12-17 21:06:49.161   596  1050 I Telecom : CallsManager: markCallAsActive, isSelfManaged: false: CSW.sA(cap)@AlQ
12-17 21:06:49.163   596  1050 I Telecom : CallsManager: setCallState ANSWERED -> ACTIVE, call: [Call id=TC@4, state=ANSWERED, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, handle=tel:********12, vidst=A, childs(0), has_parent(false), cap=[ sup_hld mut !v2a spd_aud], prop=[]], voip=false: CSW.sA(cap)@AlQ
12-17 21:06:49.190   596  1050 I Telecom : PhoneStateBroadcaster: Broadcasted state change: 2: CSW.sA(cap)@AlQ
12-17 21:06:49.309   957   957 D RILJ    : [1091]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:49.309   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:49.331   957  1273 D RILJ    : [1091]< GET_CURRENT_CALLS {[id=4,ACTIVE,toa=129,norm,mt,0,voc,noevp,,cli=1,,1,audioQuality=0] } [PHONE0]
12-17 21:06:55.815   957   957 D RILJ    : [1093]> GET_CURRENT_CALLS [PHONE0]
12-17 21:06:55.816   526   526 D RIL     : onRequest: GET_CURRENT_CALLS, sState: 10
12-17 21:06:55.823   957  1274 D RILJ    : [1093]< GET_CURRENT_CALLS {} [PHONE0]
12-17 21:06:55.857   957   957 V Telephony: onStateChanged, state: DISCONNECTED
12-17 21:06:55.864   596  9194 I Telecom : CallsManager: setCallState ACTIVE -> DISCONNECTED, call: [Call id=TC@4, state=ACTIVE, tpac=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, cmgr=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}, 1, UserHandle{0}, handle=tel:********12, vidst=A, childs(0), has_parent(false), cap=[ hld sup_hld mut !v2a spd_aud], prop=[]], voip=false: CSW.sDc(cap)@Aow
12-17 21:06:55.928   596  9194 I Telecom : PhoneStateBroadcaster: Broadcasted state change: 0: CSW.sDc(cap)@Aow
12-17 21:06:56.018   596  9720 I Telecom : CallsManager: markCallAsRemoved; callid=TC@4, immediate.: CSW.rC(cap)@ApU
12-17 21:06:56.056   596   596 I Telecom : CallsManager: handleConnectionServiceDeath: service [ConnectionServiceWrapper componentName=ComponentInfo{com.android.phone/com.android.services.telephony.TelephonyConnectionService}] died: CSW.rC->CM.pR(cap)@ApU
http://www.lryc.cn/news/263281.html

相关文章:

  • 无懈可击的防泄密之旅:迅软DSE在民营银行的成功实践
  • 【送书活动】智能汽车、自动驾驶、车联网的发展趋势和关键技术
  • 不同版本QT使用qmake时创建QML项目的区别
  • 【PHP入门】1.1-PHP初步语法
  • 如何在jenkins容器中安装python+httprunner+pytest+git+allure(一)
  • Android终端模拟器Termux上使用Ubuntu
  • 【神器】wakatime代码时间追踪工具
  • UML统一建模语言
  • Linux命令行控制小米电源开关
  • docker nginx 部署静态网站
  • uniapp之屏幕右侧出现滚动条去掉、隐藏、删除【好用!】
  • Linux 系统开机启动流程
  • vue2源码解析---watch和computed
  • 【云原生】华为云踩坑日志(更新于2023.12.10)
  • 计算机网络:自顶向下第八版学习指南笔记和课后实验--网络层(控制平面)
  • MFC 窗口创建过程与消息处理
  • 基于JavaWeb+SSM+Vue微信小程序的移动学习平台系统的设计和实现
  • 解决docker alpine /bin/sh: ./main: not found
  • 深入了解网络基础:从背景到协议
  • 针对这两个趋势,3.0全新新零售商业模式可以采取以下策略:
  • 鸿蒙HarmonyOS开发用什么语言
  • 气象数据预测分析与可视化:天气趋势预测揭秘
  • install cuda cudnn tersorRT
  • Vue 3 + Vite 4 移动端低版本白屏处理
  • Python爬虫-解决使用requests,Pyppeteer,Selenium遇到网站显示“您的连接不是私密连接”的问题|疑难杂症解决(2)
  • 机场信息集成系统系列介绍(5):机场运行资源管理系统
  • JavaEE:线程池精讲
  • spring-cloud-starter-gateway-mvc的网关实现
  • 《PySpark大数据分析实战》-11.Spark on YARN模式安装Hadoop
  • 多架构容器镜像构建实战