我使用以下代码从手机中检索联系号码列表:
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格式格式化的联系人,无论用户如何存储它们。
但是,对于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点。
从手机中检索的数字可以是任何格式,例如。
而E 164是+ 91XXXXXXXXXX,其中91是国家代码。
非常感谢任何帮助!
答案 0 :(得分:3)
您可以使用网络语言作为默认国家/地区代码,可使用getNetworkCountryIso
。这种方法在CDMA网络上可能不可靠(使用getPhoneType
来确定是否在CDMA网络上)。
这将是打电话给联系人时使用的相同值,因此您应该获得正确的值。
对于本地和国家号码,我无法帮助您,因为我在我的国家/地区没有此类功能,并且不知道它在您的国家/地区如何运作。
答案 1 :(得分:0)
Android在Honeycomb之前没有以E.16格式存储该号码。因此,如果您支持较低的API级别,则需要使用libphonenumber库自行格式化。联系人应用程序使用CountryDetector
服务来确定国家/地区代码(如果没有提供),它使用基于设备上可用信息的全面启发式算法。此服务不是公共API的一部分,并且在任何情况下都不可用于Honeycomb之前,但您可以复制ComprehensiveCountryDetector
类中的代码以在您自己的应用程序中重用。
请注意,由于Honeycomb的源代码不可用,而且我没有机会在Honeycomb设备上进行测试,我无法评论Honeycomb与这些问题相关的状态。