4

编辑:将 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 是否有一张包含世界所有国家代码和城市前​​缀的表格(我对此表示怀疑)?

还是根据您所在的国家/地区下载该数据库?

4

1 回答 1

2

最后我发现了这个东西是如何工作的

第一个 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/

于 2013-03-28T14:55:16.327 回答