2010-06-20 37 views
45

Tôi muốn truy xuất tên của liên hệ được liên kết với số điện thoại đến. Khi tôi xử lý số lượng đến trong broascastreceiver có một String với tên của người gọi đến sẽ giúp dự án của tôi rất nhiều.Android: Truy xuất tên liên hệ từ số điện thoại

Tôi nghĩ rằng điều này liên quan đến truy vấn sử dụng mệnh đề WHERE sql làm bộ lọc, nhưng tôi có cần sắp xếp các liên hệ không? Một ví dụ hoặc gợi ý sẽ có sự trợ giúp tuyệt vời.

+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 khá. 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. Liên kết: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Trả lời

60

Đối với điều đó, bạn cần sử dụng nhà cung cấp PhoneLookup được tối ưu hóa như được mô tả.

Thêm sự cho phép để AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_CONTACTS"/> 

Sau đó:

public String getContactName(final String phoneNumber, Context context) 
{ 
    Uri uri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber)); 

    String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}; 

    String contactName=""; 
    Cursor cursor=context.getContentResolver().query(uri,projection,null,null,null); 

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

    return contactName; 
} 
+0

Tắt trang dev, cảm ơn bạn đã phản hồi nhanh. Phương thức toString() trong Uri sẽ chuyển đổi truy vấn này thành tên liên hệ? –

+1

Không, bạn sẽ không phải tự mình giải quyết Cursor. Để được trợ giúp, hãy kiểm tra các câu hỏi sau: http: // stackoverflow.com/questions/903343/cursor-get-the-field-value-android – Pentium10

+1

Tôi sẽ khởi tạo một con trỏ với một managedQuery bằng cách sử dụng URI, sau đó di chuyển con trỏ đến vị trí nắm tay và lấy dữ liệu? Khi tôi nhận con trỏ ở vị trí đầu tiên, tôi sử dụng getString? Tôi cho rằng vị trí đầu tiên sẽ đúng vì truy vấn là một số do đó truy vấn sẽ chỉ lấy tên cho số đó? –

24

này was very helpful, đây là mã cuối cùng của tôi để lấy của người gọi tên, id, và Ảnh:

private void uploadContactPhoto(Context context, String number) { 

Log.v("ffnet", "Started uploadcontactphoto..."); 

String name = null; 
String contactId = null; 
InputStream input = 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.moveToFirst()) { 

    // Get values from contacts database: 
    contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID)); 
    name =  cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 

    // Get photo of contactId as input stream: 
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId)); 
    input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri); 

    Log.v("ffnet", "Started uploadcontactphoto: Contact Found @ " + number);    
    Log.v("ffnet", "Started uploadcontactphoto: Contact name = " + name); 
    Log.v("ffnet", "Started uploadcontactphoto: Contact id = " + contactId); 

} else { 

    Log.v("ffnet", "Started uploadcontactphoto: Contact Not Found @ " + number); 
    return; // contact not found 

} 

// Only continue if we found a valid contact photo: 
if (input == null) { 
    Log.v("ffnet", "Started uploadcontactphoto: No photo found, id = " + contactId + " name = " + name); 
    return; // no photo 
} else { 
    this.type = contactId; 
    Log.v("ffnet", "Started uploadcontactphoto: Photo found, id = " + contactId + " name = " + name); 
} 

... sau đó chỉ cần làm bất cứ điều gì bạn muốn với "đầu vào" (ảnh của họ dưới dạng InputStream), "na tôi ", và" contactId ".

Và đây là các tài liệu liệt kê các ~ 15 hoặc lâu hơn cột mà bạn có thể sử dụng, chỉ cần thêm chúng vào các dự báo gần đầu của mã lên trên: http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html

83

Mặc dù điều này đã được trả lời, nhưng đây là hàm hoàn chỉnh để lấy tên liên lạc từ số. Hy vọng nó sẽ giúp những người khác:

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

[Đang cập nhật dựa trên nhận xét của Marcus]

Bạn sẽ phải xin phép này:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

+0

nó làm cho ứng dụng "không chịu trách nhiệm" khi tiếp tục hoạt động. Làm thế nào tôi nên làm điều đó – myatmins

+0

Tôi cũng nhận được ANR mỗi khi tôi chạy trên Android 5.1 –

+0

Có lẽ đối với ANR, bạn cần chạy nó trên một chủ đề không phải là chuỗi giao diện người dùng. – Marc

2

Phiên bản này cũng giống như Câu trả lời của Vikram.exe với mã để tránh ANR

interface GetContactNameListener { 
    void contactName(String name); 
} 

public void getContactName(final String phoneNumber,final GetContactNameListener listener) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      ContentResolver cr = getContentResolver(); 
      Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
      Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 
      if (cursor == null) { 
       return; 
      } 
      String contactName = null; 
      if(cursor.moveToFirst()) { 
       contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
      } 

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

      listener.contactName(contactName); 
     } 
    }).start(); 

} 
1

Vượt qua số liên lạc mà từ đó bạn nhận được cuộc gọi theo phương thức sau. Phương pháp này sẽ kiểm tra xem liên hệ có được lưu trong điện thoại di động của bạn hay không. Nếu tiếp xúc được lưu sau đó nó sẽ trở lại tên liên lạc nếu không nó trả về một chuỗi số không rõ

Thêm mã này trong lớp thu phát sóng của bạn

public String getContactDisplayNameByNumber(String number,Context context) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    name = "Incoming call from"; 

    ContentResolver contentResolver = context.getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, null, null, null, null); 

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

    return name; 
} 

để lấy mã nguồn lần this link

Các vấn đề liên quan