android 系统(155)---如何自己添加号码归属地数据库?

如何自己添加号码归属地数据库?

如何自己添加号码归属地数据库?
并完成 InCallScreen 和 CallLog 界面显示自己添加的号码归属地信息。
以添加一个英文版的国内手机号码归属地举例说明。

添加一个英文版的国内手机号码归属地
 
示例步骤:

1. 在如下目录增加 GeoCodingQueryEN.java

    PATH:  [4.2 JB] alps\mediatek\frameworks-ext\base\telephony\java\com\android\internal\telephony\

                 [4.4 KK] alps\mediatek\frameworks\base\geododing\java\com\mediatek\Geocoding\

  主要负责打开 geocoding_en.db  query 号码归属地。

    GeoCodingQueryEN.java 参考 GeoCodingQuery.java 而来。

 

 

2. 添加一个归属地数据库 geocoding_en.db

    PATH: alps\mediatek\external\GeoCoding\

  手机号码英文版归属地geocoding_en.db 参考中文版而来。

 

  在同目录下的Android.mk中增加数据库,如下:

    LOCAL_PATH:= mediatek/external/GeoCoding PRODUCT_COPY_FILES += \

            $(LOCAL_PATH)/geocoding.db:system/etc/geocoding.db \

            $(LOCAL_PATH)/geocoding.db:system/etc/geocoding_en.db       

 

3. CallerInfo.java  DefaultCallLogInsertionHelper.java 中调用 GeoCodingQueryEN 的 queryByNumberforEn() 方法查归属地

    import com.android.internal.telephony.GeoCodingQueryEN;     // For EN version

    ... ...

          GeoCodingQueryEN gcQuery = GeoCodingQueryEN.getInstance(mContext); 

          String geoInfo = gcQuery.queryByNumberforEn(number);

          if (!TextUtils.isEmpty(geoInfo)) {

                return geoInfo;

           }

    ... ...

    NOTE:

      CallerInfo.java 中的修改决定IncallScreen归属地的显示;
      DefaultCallLogInsertionHelper.java 中的修改决定CallLog归属地的显示。
 
 
 
[DESCRIPTION]
 
在M版本后,已经不再使用上述MTK的号码归属地流程,改用默认的google的流程。
使用google默认的号码归属地库。由于google的库我们都无法进行相应的修改。
因此,如果有特殊的号码要进行修改,需要在如下的地方进行相应的客制化。
 
 
 
[SOLUTION]
 
 /frameworks/base/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java

protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
Rlog.d(LOG_TAG, "##### onQueryComplete() ##### query complete for token: " + token);
.......
if (ENABLE_UNKNOWN_NUMBER_GEO_DESCRIPTION) {
if (TextUtils.isEmpty(mCallerInfo.name) ||
(SystemProperties.get("ro.mtk_phone_number_geo").equals("1"))) {
mCallerInfo.updateGeoDescription(mContext, cw.number);
}
}
......
}

/frameworks/base/telephony/java/com/android/internal/telephony/CallerInfo.java
public void updateGeoDescription(Context context, String fallbackNumber) {
String number = TextUtils.isEmpty(phoneNumber) ? fallbackNumber : phoneNumber;
geoDescription = getGeoDescription(context, number);
}

//在下面的函数中对传人的number的这个号码做相应的客制化。
private static String getGeoDescription(Context context, String number) {
if (VDBG) Rlog.v(TAG, "getGeoDescription('" + number + "')...");

if (TextUtils.isEmpty(number)) {
return null;
}

/// M: CC: Query city name via GeoCodingQuery @{
// [ALPS00286530]Query Geocoding description
if (SystemProperties.get("ro.mtk_phone_number_geo").equals("1")) {
GeoCodingQuery geoCodingQuery = GeoCodingQuery.getInstance(context);
String cityName = geoCodingQuery.queryByNumber(number);
Rlog.v(TAG, "[GeoCodingQuery] cityName = " + cityName);
if ((cityName != null) && (!cityName.equals(""))) {
return cityName;
}
}
/// @}

PhoneNumberUtil util = PhoneNumberUtil.getInstance();
PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();

Locale locale = context.getResources().getConfiguration().locale;
String countryIso = getCurrentCountryIso(context, locale);
PhoneNumber pn = null;
try {
if (VDBG) Rlog.v(TAG, "parsing '" + number
+ "' for countryIso '" + countryIso + "'...");
pn = util.parse(number, countryIso);
if (VDBG) Rlog.v(TAG, "- parsed number: " + pn);
} catch (NumberParseException e) {
Rlog.d(TAG, "getGeoDescription: NumberParseException for incoming number '"
+ number + "'");
}

if (pn != null) {
String description = geocoder.getDescriptionForNumber(pn, locale);
if (VDBG) Rlog.v(TAG, "- got description: '" + description + "'");
return description;
} else {
return null;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值