题记
自研的电话应用中,有两处使用了号码归属地,一处是通话记录页,一处是通话界面;那么它们是如何实现的呢?下面进行一步一步的分析。
Dialer使用号码归属地
通话记录页的号码归属地
通过查询calls表中的Calls.GEOCODED_LOCATION字段,来进行获取号码的归属地。
相关代码如下:
查询:
startQuery(token, null, uri, CallLogQuery._PROJECTION, selection, selectionArgs.toArray(
new String[selectionArgs.size()]), Calls.DEFAULT_SORT_ORDER);
获取号码归属地
details.geocode = c.getString(CallLogQuery.GEOCODED_LOCATION);
既然是通过查询数据库而得,那么数据是何时及如何更新的呢?
熟悉通话流程框架就会知道,添加一个通话需要经过APP->Telecom->framework->modem几层进行。那么通话记录的更新就是在Telecom的CallLogManager.java进行管理;
源码地址:packages/services/Telecomm/src/com/android/server/telecom/CallLogManager
主要流程是:onCallAdd->onCallStateChanged->logCall;logCall方法到最后就是向calls表中插入该通电话的各个信息;
该文只对location(号码归属地)进行详细分析。
查看logCall的实现:
logCall(call.getCallerInfo(), logNumber, call.getPostDialDigits(), formattedViaNumber,
call.getHandlePresentation(), callLogType, callFeatures, accountHandle,
creationTime, age, callDataUsage, call.isEmergencyCall(), call.getInitiatingUser(),
logCallCompletedListener,
call.getConferenceCallLogId() /* M: For Volte Conference call */);
发现位置等信息的是存储在call.getCallerInfo()中,那么call.getCallerInfo()得到的mCallerInfo,又是怎么获取到location(号码归属地)的呢?
查看CallerInfo类,发现updateGeoDescription方法就是为了获取号码归属地;代码如下:
public void updateGeoDescription(Context context, String fallbackNumber) {
String number = TextUtils.isEmpty(phoneNumber) ? fallbackNumber : ph