2013-04-24 121 views
11

當從傳入的短信中檢索手機號碼時,它會附加國家代碼。
現在,在數據庫匹配的聯繫人可能不包括國家代碼來獲取聯繫人姓名我使用: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,但選擇代碼幾乎相同,所以我不確定爲什麼它不適用於第二個。

任何想法?

回答

9

我使用了相同的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
+0

謝謝,這可以幫助我將數字轉換爲不同的格式,但它不能解決類似問題的問題。如果有辦法讓它工作,這將是一個更簡單的解決方案,因爲我不知道用戶保存聯繫人的確切格式。 – crazyfool 2013-04-24 11:38:29

0

,如果我回答你的問題正確,我沒有放棄舒爾但我明白這一點,你有問題,該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

0

也許你可以使用一個靜態變量(數組或東西)與所有國家和地區代碼使用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 
    } 
} 
0

雖然我的解決方案可能看起來很髒,但這可能會訣竅。

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); 
       } 
      } 
     } 
    } 

希望它可以幫助...

7

上個月我有同樣的問題,我設法使用谷歌的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; 
} 

希望它能解決您的問題。

2

對於這種類型的谷歌本身的問題相同的代碼返回的ContactID返回名稱 已經爲我們提供的庫專門用於安卓手機。請勿使用任何類型的有線代碼,查看由經驗豐富的開發人員測試的Google官方庫。

使用libphonenumber谷歌圖書館用於解析,格式化,存儲和驗證國際電話號碼。

在這個着陸頁上有很多代碼片段,所以我認爲不需要在這裏寫任何代碼,只能從那裏瞭解它們。

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

他們給了人的資源如何分析和如何搭配。

這個圖書館的特點與你有關。

  • 解析/格式化/驗證電話號碼的所有國家/地區世界 。

  • isNumberMatch - 對兩個數字 是否相同得到置信度。

  • findNumbers - 在文本輸入中查找數字。

0

這種技術適用於我,解析部分號碼,使用:

//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位數字的匹配,希望它將有助於!

相關問題