2011-07-17 52 views
10

Tôi đang cố truy xuất tên liên lạc được cung cấp số điện thoại liên lạc. Tôi đã thực hiện một chức năng mà nên làm việc trong tất cả các phiên bản API, bởi tôi không thể làm cho nó hoạt động trong 1,6 và tôi không thể nhìn thấy vấn đề, có lẽ ai đó có thể phát hiện ra nó?Nhận tên liên lạc được cung cấp số điện thoại trong Android

Lưu ý rằng, tôi đã thay thế các hằng số API cho các chuỗi vì vậy tôi không có vấn đề cảnh báo không được chấp nhận.

public String getContactName(final String phoneNumber) 
{ 
    Uri uri; 
    String[] projection; 

    if (Build.VERSION.SDK_INT >= 5) 
    { 
     uri = Uri.parse("content://com.android.contacts/phone_lookup"); 
     projection = new String[] { "display_name" }; 
    } 
    else 
    { 
     uri = Uri.parse("content://contacts/phones/filter"); 
     projection = new String[] { "name" }; 
    } 

    uri = Uri.withAppendedPath(uri, Uri.encode(phoneNumber)); 
    Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null); 

    String contactName = ""; 

    if (cursor.moveToFirst()) 
    { 
     contactName = cursor.getString(0); 
    } 

    cursor.close(); 
    cursor = null; 

    return contactName; 
} 
+1

Không hỗ trợ 1.6 nữa! http://developer.android.com/resources/dashboard/platform-versions.html. Nó chỉ chiếm 2,2% cơ sở người dùng hiện tại và con số đó sẽ co lại, co lại, thu nhỏ. Nó có thể không bao giờ đạt đến số không, nhưng đó chỉ là do những công nghệ lạc hậu mà sẽ không nghe về ứng dụng cạnh chảy máu mới của bạn anyway! Đừng lãng phí thời gian của bạn! –

+0

Đối với cơ sở của những người khác, tôi đã viết một bài có chứa toàn bộ mã để truy vấn tên, hình ảnh, ID liên lạc, vv với lời giải thích tốt. Mã có chứa các đoạn mã như được tìm thấy trên các câu trả lời khác nhau, nhưng được tổ chức và thử nghiệm hơn. Link: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Trả lời

9

Sử dụng phản xạ thay vì so sánh phiên bản sdk.

public String getContactName(final String phoneNumber) 
{ 
    Uri uri; 
    String[] projection; 
    mBaseUri = Contacts.Phones.CONTENT_FILTER_URL; 
    projection = new String[] { android.provider.Contacts.People.NAME }; 
    try { 
     Class<?> c =Class.forName("android.provider.ContactsContract$PhoneLookup"); 
     mBaseUri = (Uri) c.getField("CONTENT_FILTER_URI").get(mBaseUri); 
     projection = new String[] { "display_name" }; 
    } 
    catch (Exception e) { 
    } 


    uri = Uri.withAppendedPath(mBaseUri, Uri.encode(phoneNumber)); 
    Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null); 

    String contactName = ""; 

    if (cursor.moveToFirst()) 
    { 
     contactName = cursor.getString(0); 
    } 

    cursor.close(); 
    cursor = null; 

    return contactName; 
} 
+0

Xin chào, tôi đã thử một cái gì đó tương tự, nhưng nó không hoạt động. Đây là câu hỏi của tôi, tôi thực sự sẽ đánh giá cao sự giúp đỡ của bạn! :) http://stackoverflow.com/questions/35097844/get-contact-name/35098111#35098111 –

19

Điều này dường như làm việc tốt trong các phiên bản mới nhất:

private String getContactName(Context context, String number) { 

    String name = null; 

    // define the columns I want the query to return 
    String[] projection = new String[] { 
      ContactsContract.PhoneLookup.DISPLAY_NAME, 
      ContactsContract.PhoneLookup._ID}; 

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

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

    if(cursor != null) { 
     if (cursor.moveToFirst()) { 
      name =  cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
      Log.v(TAG, "Started uploadcontactphoto: Contact Found @ " + number);    
      Log.v(TAG, "Started uploadcontactphoto: Contact name = " + name); 
     } else { 
      Log.v(TAG, "Contact Not Found @ " + number); 
     } 
     cursor.close(); 
    } 
    return name; 
} 
+1

Cảm ơn nó hoạt động, nhưng nếu bạn sẽ nhận được rất nhiều tên, bạn nên làm cho nó trong asyncTask để tránh không đáp ứng lỗi do để tải nhiều trong chủ đề chính. – Aziz

0
private String getContactNameFromNumber(String number) { 
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 


Cursor cursor = context.getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},null,null,null); 
if (cursor.moveToFirst()) 
{ 
    name = cursor.getString(cursor.getColumnIndex(PhoneLookup.D 
0
public static String getContactName(Context context, String phoneNumber) 
{ 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    Cursor cursor = cr.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null); 
    if (cursor == null) 
    { 
     return null; 
    } 
    String contactName = null; 
    if(cursor.moveToFirst()) 
    { 
     contactName = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 
    } 

    if(cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
    } 

    return contactName; 
} 
Các vấn đề liên quan