通话状态监听-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.mzph.cn/news/229621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-猴子吃桃问题

一、需求分析 有一群猴子摘了一堆桃子&#xff0c;他们每天都吃当前桃子的一半且再多吃一个&#xff0c;到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。要求&#xff1a; 1)采用数组数据结构实现上述求解&#xff1b; 2)采用链数据结构实现上述…

TrustZone之其他设备及可信基础系统架构

一、其他设备 最后,我们将查看系统中的其他设备,如下图所示: 我们的示例TrustZone启用的系统包括一些尚未涵盖的设备,但我们需要这些设备来构建一个实际的系统。 • 一次性可编程存储器(OTP)或保险丝 这些是一旦写入就无法更改的存储器。与每个芯片上都包含相同…

数据仓库与数据挖掘小结

更加详细的只找得到pdf版本 填空10分 判断并改错10分 计算8分 综合20分 客观题 填空10分 判断并改错10分--错的要改 mooc中的--尤其考试题 名词解释12分 4个&#xff0c;每个3分 经常碰到的专业术语 简答题40分 5个&#xff0c;每道8分 综合 画roc曲线 …

02.Git常用基本操作

一、基本配置 &#xff08;1&#xff09;打开Git Bash &#xff08;2&#xff09;配置姓名和邮箱 git config --global user.name "Your Name" git config --global user.email "Your email" 因为Git是分布式版本控制工具&#xff0c;所以每个用户都需要…

数据安全传输基础设施平台(一)

1引言 1.1项目简介 数据安全传输基础设置平台项目&#xff08;简称&#xff0c;数据传输平台&#xff09;&#xff0c;是一款基础设施类项目&#xff0c;为集团、企业信息系统的提供统一、标准的信息安全服务&#xff1b;解决企业和企业之间&#xff0c;集团内部信息数据的传…

gitee提交代码步骤介绍(含git环境搭建)

1、gitee官网地址 https://gitee.com; 2、Windows中安装git环境 参考博客&#xff1a;《Windows中安装Git软件和TortoiseGit软件》&#xff1b; 3、设置用户名和密码 这里的用户名和密码就是登录gitee网站的用户名和密码如果设置错误&#xff0c;可以在Windows系统的“凭据管理…

【深度学习目标检测】九、基于yolov5的安全帽识别(python,目标检测)

YOLOv5是目标检测领域一种非常优秀的模型&#xff0c;其具有以下几个优势&#xff1a; 1. 高精度&#xff1a;YOLOv5相比于其前身YOLOv4&#xff0c;在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进&#xff0c;如更深的网络结构、更多的特征层和更高分辨率的输入图…

IDEA2023 + spring cloud 工程热部署设置方法

基于spring cloud 工程进行热部署 &#xff0c;实现每次修改工程源文件&#xff0c;后台自动启动&#xff0c;方便开发测试工作。具体分为5步骤即可&#xff1a; 1、修改工程的pom文件&#xff0c;增加adding devtools 工具包。 <dependency> <groupId>org.s…

js基础入门

先来一点js基础&#xff0c;其实js大部分的时候都在处理对象或者数组。 对象四个基本操作&#xff1a;增删改查 掌握元素的增删改查&#xff0c;了解如何拷贝&#xff0c;深拷贝和浅拷贝的区别。详情见代码 <script>//创建对象一共有三种赋值声明的语法let obj{} //赋值…

Vue 项目关于在生产环境下调试

前言 开发项目时&#xff0c;在本地调试没问题&#xff0c;但是部署到生产会遇到一些很奇怪的问题&#xff0c;本地又没法调&#xff0c;就需要在生产环境/域名下进行调试。 在这里介绍一个插件Vue force dev ,浏览器扩展里下载 即便是设置了Vue.config.devtoolsfalse 只要安…

认知能力测验,③如何破解语言常识类测试题?

作为认知能力测评中的一个环节&#xff0c;语言常识类&#xff0c;是大概率的出现&#xff0c;不同的用人单位可能略有不同&#xff0c;语言是一切的基础&#xff0c;而常识则意味着我们的知识面的宽度。 语言常识类的测试&#xff0c;如果要说技巧&#xff1f;难说....更多的…

maui sqlite开发一个商城加购物车的演示(3)

购物车界面及代码 <?xml version"1.0" encoding"utf-8" ?> <ContentPage xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/xaml"xmlns:syncfusion"clr-namesp…

ArcMap自定义脚本工具箱迁移至ArcGIS pro

本文记录了将ArcMap10.7创建的自定义脚本工具箱&#xff08;.tbx&#xff09;迁移至ArcGIS pro的过程 ArcGIS Pro使用的是python版本与ArcMap不同&#xff0c;前者为python3&#xff0c;后者为python2。由于python3 和 python2 的部分语法不兼容&#xff0c;以及一些地理处理工…

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好&#xff0c;我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了&#xff0c;火爆程度压过Google的Gemini。 缘起是MistralAI二话不说&#xff0c;直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…

vue3的大致使用

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…

磁力计LIS2MDL开发(3)----九轴姿态解算

磁力计LIS2MDL开发.3--九轴姿态解算 概述视频教学样品申请完整代码下载使用硬件欧拉角万向节死锁四元数法姿态解算双环PI控制器偏航角陀螺仪解析代码 概述 LIS2MDL 包含三轴磁力计。 lsm6ds3trc包含三轴陀螺仪与三轴加速度计。 姿态有多种数学表示方式&#xff0c;常见的是四元…

服务器RAID配置及功能介绍

服务器RAID配置及功能介绍 一、RAID磁盘阵列详解1.RAID磁盘阵列介绍2.RAID 03.RAID14.RAID35.RAID56.RAID67.RAID 10总结阵列卡介绍 一、RAID磁盘阵列详解 1.RAID磁盘阵列介绍 ①是Redundant Array of lndependent Disks的缩写中文简称为独立冗余磁盘阵列。 ②把多块独立的物…

NBA得分数据可视化

简介 这是上学期的一些课外活动内容&#xff0c;将 NBA 得分数据进行可视化&#xff0c;并进行后续的探索性分析和建模&#xff08;本文未介绍&#xff09;。主要研究动机来源于这篇论文&#xff1a; 该论文使用二元的伽马过程来刻画 NBA 主客场得分数据&#xff0c;并且考虑了…

5.5 Linux Apache服务

1、概念介绍 a. Web 服务简介 WEB服务器也称为WWW(WORLD WIDE WEB&#xff0c;万维网)服务器&#xff0c;主要功能是提供网上信息浏览服务。 常用web服务器&#xff1a;httpd&#xff08;apache&#xff09;、nginx、tomcat、IIS 客户端&#xff1a;IE、firefox、chrome b…