6

我使用以下代码从电话中检索联系人号码列表:

Cursor c = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

while(c.moveToNext()){
      Log.d(TAG,"NO.: "+ c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER)));
}

在 API 16 及更高版本中,这对我来说非常有用,因为我希望所有联系人都以 E 164 格式格式化,无论用户如何存储它们。

  1. 但是,对于低于 16 的 API,上述代码将不起作用,并且我无法使用以下行获取所有联系人的 E 164 格式:

     c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    

“PhoneNumberUtils”类不能派上用场。

此外,我无法使用libphonenumber库将数字转换为 E 164 格式,因为我不知道联系人的 ISO 3166-1 两个字母国家代码。

有什么方法可以为 Android 中的每个联系人获取 ISO 3166-1 两个字母的国家/地区代码,以便我可以使用 libphonenumber 库?

或者是否有任何其他解决方案可以实现第 1 点。?

从电话中检索到的号码可以是任何格式,例如。

  • 本地 : 965XXXXXXX
  • 国家 : 0965XXXXXXX
  • 国际:+91 96 5X XXXXXX
  • 和别的

而 E 164 是 +91XXXXXXXXXX,其中 91 是国家代码。

任何帮助将非常感激 !

4

2 回答 2

4

您可以使用网络语言作为默认国家/地区代码,可使用getNetworkCountryIso. 此方法在 CDMA 网络上可能不可靠(用于getPhoneType确定是否在 CDMA 网络上)。

这将与打电话给联系人时使用的值相同,因此您应该获得正确的值。

对于本地到全国的号码,我无法为您提供帮助,因为我在我的国家没有这样的功能,也不知道它在您的国家是如何运作的。

于 2014-01-06T08:59:38.557 回答
0

在 Honeycomb 之前,Android 并没有以 E.16 格式存储数字。因此,如果您支持较低的 API 级别,则需要使用 libphonenumber 库自行对其进行格式化。如果未提供国家代码,联系人应用程序将使用该CountryDetector服务来确定国家代码,该服务使用基于设备上可用信息的全面启发式方法。此服务不是公共 API 的一部分,并且在任何情况下在 Honeycomb 之前都不可用,但您可以复制ComprehensiveCountryDetector类中的代码以在您自己的应用程序中重用。

请注意,由于 Honeycomb 的源不可用,而且我没有机会在 Honeycomb 设备上进行测试,因此我无法评论 Honeycomb 与这些问题相关的状态。

于 2014-01-12T03:47:45.177 回答