4

編集:おそらくシアン機能であるため、JellyBeanをcyanogenmod 10に変更しました

CyanogenMod10 phone の下にある自分の電話が、通話ログに発信者の (おおよその) 場所を表示することに気付きました (電話番号が連絡先にない固定電話の場合のみ)。

発信者が見つかった場合は発信者の都市も表示されるため、国番号だけに依存するわけではありません。Contacts パッケージ アプリを参照したところ、データベースから値が取得されていることがわかりました (com.android.contacts.CallDetailActivity 内)。

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

そのため、電話の発信または受信に成功した後、電話パッケージアプリにあると思いました。しかし、私はすぐにソースで自分自身を失いました...それらの値がどこでどのように(簡単に)どのように設定され、ジオコードが解決されるかを知りたいです。

謎のウェブサービスに電話番号が送られている?

Cyanogen には、世界のすべての国コードと都市のプレフィックスを含む表がありますか (私は疑います)?

それとも、あなたがいる国に応じてその DB がダウンロードされますか?

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 に答える