2010-06-15 13 views
33

Tôi đang cố gắng gọi cho bộ chọn địa chỉ liên hệ, nhận tên người, điện thoại và e-mail thành chuỗi và gửi chúng đến một hoạt động khác bằng ý định. Cho đến nay công trình này:lấy thông tin liên lạc từ bộ chọn số liên lạc Android

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
startActivityForResult(intent, 1); 

// ... 

@Override 
public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    super.onActivityResult(reqCode, resultCode, data); 
    if (resultCode == Activity.RESULT_OK) { 
     Uri contactData = data.getData(); 
     Cursor c = managedQuery(contactData, null, null, null, null); 
     if (c.moveToFirst()) { 
      String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 
      Intent intent = new Intent(CurrentActivity.this, NewActivity.class); 
      intent.putExtra("name", name); 
      startActivityForResult(intent, 0); 
     } 
    } 
} 

Nhưng nếu tôi thêm vào:

String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

nó lực lượng đóng

lẽ theres một cách khác để có được số của họ?

Trả lời

61

số điện thoại

Số điện thoại được lưu trữ trong bảng của mình và cần phải được truy vấn riêng biệt. Để truy vấn bảng số điện thoại, hãy sử dụng URI được lưu trữ trong biến SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Sử dụng WHERE có điều kiện để nhận số điện thoại cho số liên lạc được chỉ định.

if (Integer.parseInt(cur.getString(
      cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
     Cursor pCur = cr.query(
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
     new String[]{id}, null); 
     while (pCur.moveToNext()) { 
     // Do something with phones 
     } 
     pCur.close(); 
    } 

Thực hiện truy vấn thứ hai đối với danh bạ Android Cơ sở dữ liệu SQLite. Các số điện thoại được truy vấn đối với URI được lưu trữ trong ContactsContract.CommonDataKinds.Phone.CONTENT_URI. ID liên lạc được lưu trong bảng điện thoại dưới dạng ContactsContract.CommonDataKinds.Phone.CONTACT_ID và mệnh đề WHERE được sử dụng để giới hạn dữ liệu được trả về.

Địa chỉ Email

Truy vấn địa chỉ email cũng tương tự như số điện thoại. Một truy vấn phải được thực hiện để lấy địa chỉ email từ cơ sở dữ liệu. Truy vấn URI được lưu trữ trong ContactsContract.CommonDataKinds.Email.CONTENT_URI để truy vấn bảng địa chỉ email.

Cursor emailCur = cr.query( 
     ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
     new String[]{id}, null); 
    while (emailCur.moveToNext()) { 
     // This would allow you get several email addresses 
      // if the email addresses were stored in an array 
     String email = emailCur.getString(
         emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
     String emailType = emailCur.getString(
         emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
    } 
    emailCur.close(); 

Giống như truy vấn điện thoại, tên trường cho bảng email cũng được lưu trong ContactsContract.CommonDataKinds. Truy vấn email được thực hiện trên URI trong ContactsContract.CommonDataKinds.Email.CONTENT_URI và mệnh đề WHERE phải khớp với trường ContactsContract.CommonDataKinds.Email.CONTACT_ID. Vì nhiều địa chỉ email có thể được lưu trữ vòng lặp thông qua các bản ghi được trả về trong Con trỏ.

Hướng dẫn khác here

Phương pháp này yêu cầu API Android phiên bản 5 trở lên.

+0

hoạt động tuyệt vời và trang web bạn liên kết với cũng deffo hữu ích, cảm ơn – ng93

+1

Làm cách nào để tôi truy vấn số điện thoại trong vòng lặp cuối cùng? – eyal

+7

cr.query dường như không hoạt động.Ngoài ra, id là gì trong String [] {id} ... dường như không thể tìm thấy một trong hai biến này. –

1

Dựa trên câu trả lời được chấp nhận, nếu bạn muốn nhảy thẳng đến địa chỉ email mong muốn và không yêu cầu một cái gì đó sử dụng danh bạ cho phép như thế này:

private static final int REQUEST_CODE_EMAIL = 1; 

void startSelectingEmail() { 
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); 
    startActivityForResult(intent, REQUEST_CODE_EMAIL); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_EMAIL) { 
     Uri emailUri = data.getData(); 
     Cursor emailCursor = getContext().getContentResolver().query(emailUri, null, null, null, null); 
     if (emailCursor != null) { 
      if (emailCursor.moveToFirst()) { 
       String email = emailCursor.getString(
         emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA)); 
       String emailType = emailCursor.getString(
         emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.TYPE)); 
       Log.d(TAG, "Email: " + emailType + " " + email); 
      } 
      emailCursor.close(); 
     } 
    } 
} 

này không yêu cầu sự cho phép địa chỉ liên lạc để đọc địa chỉ email giống như các phương thức truy vấn kép ở trên. Nó cũng làm cho nó để bạn không cần phải viết giao diện người dùng cho người dùng để chọn địa chỉ email thích hợp cho địa chỉ liên lạc với nhiều email, người dùng chọn một email cụ thể trong ứng dụng Danh bạ để bạn chỉ nhận được một kết quả.

Con trỏ quay trở lại với một vài cột ngoài địa chỉ email như tên hiển thị, mặc dù chỉ được xác minh trên Nexus 5 chạy Android M.