在Android API中获取E 164格式的联系人少于16

时间:2013-12-04 00:27:13

标签: android contactscontract libphonenumber

我使用以下代码从手机中检索联系号码列表:

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));
    
  2. 'PhoneNumberUtils'类无法使用。

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

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

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

    从手机中检索的数字可以是任何格式,例如。

    • Local:965XXXXXXX
    • National:0965XXXXXXX
    • 国际:+91 96 5X XXXXXX
    • 和其他

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

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

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

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

对于本地和国家号码,我无法帮助您,因为我在我的国家/地区没有此类功能,并且不知道它在您的国家/地区如何运作。

答案 1 :(得分:0)

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

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

相关问题