Android - 从号码与国家或地区代码联系

问题描述:

当从传入的短信中检索手机号码时,它会附加国家代码。
现在,在数据库匹配的联系人可能不包括国家代码来获取联系人姓名我使用:Android - 从号码与国家或地区代码联系

public static String getContactName(String number, Context context) { 

    try { 

     Uri personUri = Uri.withAppendedPath(
      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.trim())); 
     String selection = PhoneLookup.NUMBER + " LIKE %" + number.trim() + "%"; 
     Cursor cur = context.getContentResolver().query(personUri, 
      new String[] { 
      PhoneLookup.DISPLAY_NAME 
     }, 
      selection, null, null); 
     if (cur.moveToFirst()) { 
      String str = cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 
      cur.close(); 
      return str; 
     } 
    } catch (Exception e) { 
     //e.printStackTrace(); 
     return number; 
    } 
    return number; 
} 

这工作完全,如果我通过精确匹配或部分匹配。但是,如果我想我正在使用此代码联系ID:

public static Contact getContact(String number, ContentResolver contentResolver) { 

    Contact contact = new Contact(-1, number); 
    try { 
     Uri personUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(number)); 
     String selection = ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE '%" + number + "%'"; 
     Cursor cur = contentResolver.query(personUri, 
      new String[] { 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID, PhoneLookup.DISPLAY_NAME 
     }, 
      selection, null, null); 
     if (cur.moveToFirst()) { 
      contact = new Contact(Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID))), 
       cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME))); 
     } 
     cur.close(); 
    } catch (Exception e) {} 
    return contact; 
} 

这完美的作品,如果数字是精确匹配,但如果它是不是没有返回。我需要这种方法来查找其号码保存为“01111111111”并且来电号码为“+441111111111”的联系人的ID。虽然他们正在查看不同的URI,但选择代码几乎相同,所以我不确定为什么它不适用于第二个。

任何想法?

我使用了相同的reuirement这个代码,并通过您的问题将得到解决

public static String getContactDisplayNameByNumber(String number) { 
    Uri uri = Uri.withAppendedPath(
      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(number)); 
    String name = "?"; 

    ContentResolver contentResolver = context.getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, new String[] { 
      BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME }, 
      null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup 
        .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
      // String contactId = 
      // contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); 
     } 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 
+0

这看起来更像我以后 - 我没有在我的atm前面的代码,但我会检查一下,看看这是否适用于我,谢谢 – crazyfool 2013-05-09 14:37:32

+0

它看起来不符合印度或俄罗斯数字。例如:联系号码89997654321,来电+79997654321 – Gaket 2018-01-30 06:42:00

+0

谢谢,这可以帮助我将数字转换为不同的格式,但它不能解决类似问题的问题。如果有办法让它工作,这将是一个更简单的解决方案,因为我不知道用户保存联系人的确切格式。 – crazyfool 2013-04-24 11:38:29

,如果我回答你的问题正确,我没有放弃舒尔但我明白这一点,你有问题,该phonenumer可能出现在两种不同的方式。有或没有国家代码。

我想会有两个简单的解决方案。最简单的方法是更改​​收件箱中的读取输入。收件箱将始终具有可修剪的国家代码。 例如

String inboxNo; //the number you've read from the inbox 
int length = inboxNo.length  
if ((inboxNo.equals(whatYouAreSearching) || (String withOutCountryCode = "0"+ inboxNo.substring(3,length-1)) 
... 

其他的解决方案可能是您检查数据库的第一个字符,并将其转换 例如

if(!dataBaseNo.substring(0,1).contanins("+"){ 
dataBaseNo = "+44" + dataBaseNo.substring(1,length-1); 
... 
+0

由于不同的国家/地区有不同的代码,因此获取子字符串不太可靠。 – CKmum 2013-05-07 20:05:05

+0

我想解决方案之一会工作。也许你必须把第三个或在if子句中检查国家代码是否包含3个字符(取决于你想提供的国家代码)。 – B770 2013-05-08 07:12:51

也许你可以使用一个静态变量(数组或东西)与所有国家和地区代码使用2回合方法正确匹配的代码。如果国家/地区代码被添加或其他东西,这个阵列可以通过更新或如果你需要很好地刷新,从一个标准的源在线拉,并从您的应用程序触发定期更新。

private static int countrycodes[]; // define the entire data here 
... 
{ 
... 
for(int i=0;i<countrycodes.length;i++){ 
    //match using regexp or something and flag this for 2nd pass 
    } 
} 

虽然我的解决方案可能看起来很脏,但这可能会诀窍。

String number = "your number"; 
    ContentResolver contentResolver; // content resolver 
    Contact c; 
    if (number != null) { 
     if (number.charAt(0) == '+') { 
      c = getContact(number.substring(1), contentResolver); 
      if (c.firstField == -1) { 
       c = getContact(number.substring(2), contentResolver); 
       if (c.firstField == -1) { 
        c = getContact(number.substring(3), contentResolver); 
       } 
      } 
     } else { 
      c = getContact(number, contentResolver); 
      if (c.firstField == -1) { 
       c = getContact(number.substring(1), contentResolver); 
       if (c.firstField == -1) { 
        c = getContact(number.substring(2), contentResolver); 
       } 
      } 
     } 
    } 

希望它可以帮助...

上个月我有同样的问题,我设法使用谷歌的libphonenumber库来解决这个问题。

该问题只发生在本地/国家电话号码,因为他们可以保存没有国家代码或使用'0'。

例如:

在印度一个典型的电话号码可以保存在下列格式

a. +919665123456 
    b. 919665123456 
    c. 09665123456 
    d. 9665123456 

和每一个上面都完全有效的格式在印度拨通的只是

但在如果属于您所在国家以外的电话号码必须通过国家代码强制保存,否则您将无法拨打电话。

ex. 

a. +1732-757-2923 (US) 
b. +97433-456-789 (Qatar) 

因此,如果有关接触local/national真的出现匹配的联系人的问题。

而这就是libphonenumber进入图片。使用图书馆,我们可以提取属于该特定国家的实际国家格式的电话号码。

这是诀窍。首先将收到的来自短信的号码传递给uri,以便在数据库中进行匹配。如果不匹配,则使用libphonenumber提取国有化电话号码 ,然后再次将其作为uri传递以进行匹配。 (Uri.encode(number)

它工作在我的情况。

我以如下方式使用它。

public String getContactDisplayNameByNumber(String number) { 

    if (number != null && number.length() != 0) { 

     String name = lookupNumber(number); 

     if (!name.contains(number)) 
      return name; 
     else { 

      TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

      String usersCountryISOCode = manager.getNetworkCountryIso(); 

      PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); 
      try { 
       PhoneNumber phonenUmber = phoneUtil.parse(name, 
         usersCountryISOCode); 
       if (phoneUtil.isValidNumber(phonenUmber)) { 
        temp = phoneUtil 
          .getNationalSignificantNumber(phonenUmber); 


        name = lookupNumber(temp); 
        return name; 
       } 

      } catch (Exception e) { 

       e.printStackTrace(); 

      } 
      return number; 
     } 
    } else { 
     return "Invalid Number"; 
    } 
} 

private String lookupNumber(String number) { 

    uri = Uri.withAppendedPath(
      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(number)); 
    name = number; 

    contentResolver = getContentResolver(); 
    contactLookup = contentResolver.query(uri, columns, null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup 
        .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 

     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 

希望它能解决您的问题。

对于这种类型的谷歌本身的问题相同的代码返回的ContactID返回名称 已经为我们提供的库专门用于安卓手机。请勿使用任何类型的有线代码,查看由经验丰富的开发人员测试的Google官方库。

使用libphonenumber谷歌图书馆用于解析,格式化,存储和验证国际电话号码。

在这个着陆页上有很多代码片段,所以我认为不需要在这里写任何代码,只能从那里了解它们。

http://code.google.com/p/libphonenumber/

他们给了人的资源如何分析和如何搭配。

这个图书馆的特点与你有关。

  • 解析/格式化/验证电话号码的所有国家/地区世界 。

  • isNumberMatch - 对两个数字 是否相同得到置信度。

  • findNumbers - 在文本输入中查找数字。

这种技术适用于我,解析部分号码,使用:

//encode the phone number and build the filter URI 
Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.substring(len-9))); 

String selection = PhoneLookup.NUMBER + " LIKE %" + number.substring(len-9) + "%"; 

Cursor cursor = context.getContentResolver().query(contactUri, projection, selection, null, null); 

完整的例子:

private void getContactDetails(String number) { 
    // define the columns you want the query to return 
    String[] projection = new String[] { 
     PhoneLookup.DISPLAY_NAME, 
     PhoneLookup._ID, 
     PhoneLookup.LOOKUP_KEY}; 
    int len = number.length(); 
    // encode the phone number and build the filter URI 
    Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number.substring(len-9))); 

    String selection = PhoneLookup.NUMBER + " LIKE %" + number.substring(len-9) + "%"; 

    Cursor cursor = context.getContentResolver().query(contactUri, projection, selection, null, null); 

    if(cursor != null) { 
     if (cursor.moveToFirst()) { 
      String name = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 
      String lookUpKey = cursor.getString(cursor.getColumnIndex(PhoneLookup.LOOKUP_KEY)); 
     } 
     cursor.close(); 
    } 
} 

它只是分析,最后10位数字的匹配,希望它将有助于!