我的 phone(和一些应用程序)如何知道在我的联系人中的号码后附加什么国家代码前缀(如 +1、+505、+49...)

How does my phone (and some apps) know what country code prefix (like +1, +505, +49...) to append to numbers in my contacts

我最近很惊讶 android 似乎没有标准方法来获取国家代码(我的意思是 +1、+49、+39 而不是美国、通用电气、IT)你自己的 phone。 TelephonyManager 可让您获得大量其他信息,包括 phone(IN、US、IT...)的两个字母字符串国家代码,甚至是您的 sim 卡,但不包括拨号前缀。

在广泛搜索这个问题后,我发现人们已经通过创建自己的 country_code-prefix 通信数据库(即 {IT,+39}...)(参见 this)解决了这个问题听起来很疯狂(感觉就像把两根棍子摩擦在一起生火 XD),这意味着全世界无数开发人员都在编写自己的数据库来解决 TelephonyManager 应该解决的问题。

我觉得有些系统应用程序似乎从某个地方知道这个代码很奇怪。例如,即使我在没有前缀的情况下保存了他们的号码,我也能够从国外呼叫联系人,而且 whatsapp 通常也能够推断出正确的前缀。

我的通讯录应用程序使用什么方法来推断正确的前缀?它是否有自己的私人数据库,不会与我们共享?这有什么原因吗,比如我不知道的一些安全问题? Whatsapp 是怎么做到的?

我对此很感兴趣。也许我没有在谷歌上搜索足够多并且那里有方法但是很多人似乎正在使用上述数据库方法解决它。

如果能帮助理解这一点,我们将不胜感激

这由 Google 的 libphonenumber 库支持,请参阅 https://github.com/google/libphonenumber/blob/master/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java#L2373

基本上你会做这样的事情:

// get region, e.g. "US"
TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String region = telephony.getNetworkCountryIso().toUpperCase(Locale.getDefault());

// get country code from region, e.g. "US" => 1
PhoneNumberUtil libphone = PhoneNumberUtil.createInstance(this);
int code = libphone.getCountryCodeForRegion(region);