android – CyanogenMod10如何计算出来电者的位置?

编辑:将JellyBean更改为cyanogenmod 10,因为它可能是一种氰基特征

我注意到CyanogenMod10手机下的手机在通话记录中显示了来电者的(近似)位置(仅当号码是我的联系人中没有的固定电话时).

它不仅仅依赖于国家/地区代码,因为它还会在找到时显示调用者的城市.我浏览了联系人包应用程序,发现从数据库获取了值(在com.android.contacts.CallDetailActivity中)

final String countryIso = callCursor.getString(COUNTRY_ISO_COLUMN_INDEX);
final String geocode = callCursor.getString(GEOCODED_LOCATION_COLUMN_INDEX);

所以我虽然在成功拨打或接听电话后是在电话套餐应用程序中.但我很快就迷失在源头……我想知道在哪里和(简要地)如何设置这些值并解决地理编码问题.

电话号码是否发送到神秘的网络服务?

Cyanogen是否有一张包含世界上所有国家代码和城市前​​缀的表格(我对此表示怀疑)?

或者根据您所在的国家/地区下载该数据库

解决方法

最后我发现这件事是如何运作的

第一
ContactsProvider在调用DefaultCallLogInsertionHelper.addComputedValues时添加此值

看这里

https://github.com/CyanogenMod/android_packages_providers_ContactsProvider/blob/ics/src/com/android/providers/contacts/DefaultCallLogInsertionHelper.java#L59

@Override
public void addComputedValues(ContentValues values) {
    // Insert the current country code,so we kNow the country the number belongs to.
    String countryIso = getCurrentCountryIso();
    values.put(Calls.COUNTRY_ISO,countryIso);
    // Insert the geocoded location,so that we do not need to compute it on the fly.
    values.put(Calls.GEOCODED_LOCATION,getGeocodedLocationFor(values.getAsstring(Calls.NUMBER),countryIso));
}

所以你看到的代码

final String countryIso = callCursor.getString(COUNTRY_ISO_COLUMN_INDEX);
final String geocode = callCursor.getString(GEOCODED_LOCATION_COLUMN_INDEX);

实际上是从保存的数据中读取

因此,真实数据来自PhoneNumberOfflineGeocoder,您可以在此处找到
https://github.com/CyanogenMod/android_external_libphonenumber/blob/ics/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java

这就是libphonenumber

https://code.google.com/p/libphonenumber/

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...