2010-06-15 89 views
33

我試圖撥打聯繫人選擇器,將人員姓名,電話和電子郵件轉換爲字符串,並使用意圖將其發送到其他活動。到目前爲止,這個工程:從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); 
     } 
    } 
} 

但是,如果我在補充:

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

它強制關閉

也許那裏有另一種方式來獲得他們的號碼?

回答

61

電話號碼

電話號碼存儲在自己的表,需要單獨查詢。要查詢電話號碼錶,請使用存儲在SDK變量ContactsContract.CommonDataKinds.Phone.CONTENT_URI中的URI。使用WHERE條件來獲取指定聯繫人的電話號碼。

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

對Android聯繫人SQLite數據庫執行第二個查詢。電話號碼將根據存儲在ContactsContract.CommonDataKinds.Phone.CONTENT_URI中的URI進行查詢。聯繫人ID作爲ContactsContract.CommonDataKinds.Phone.CONTACT_ID存儲在電話表中,WHERE子句用於限制返回的數據。

電子郵件地址

查詢電子郵件地址類似於電話號碼。必須執行查詢才能從數據庫獲取電子郵件地址。查詢存儲在ContactsContract.CommonDataKinds.Email.CONTENT_URI中的URI以查詢電子郵件地址表。

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

與電話查詢一樣,電子郵件表的字段名也存儲在ContactsContract.CommonDataKinds下。電子郵件查詢在ContactsContract.CommonDataKinds.Email.CONTENT_URI中的URI上執行,並且WHERE子句必須與ContactsContract.CommonDataKinds.Email.CONTACT_ID字段匹配。由於可以通過Cursor中返回的記錄循環存儲多個電子郵件地址。

更多教程here

這種方法需要的Android API版本5或更高。

+0

的偉大工程,你掛好deffo網站派上用場,謝謝 – ng93 2010-06-15 14:56:47

+1

如何查詢最後while循環中的電話號碼? – eyal 2011-07-10 11:23:52

+7

cr.query似乎不起作用。此外,String [] {id}中的id是什麼...似乎無法找到這些變量中的任何一個。 – 2011-07-29 01:24:00

1

大廈接受的答案,如果你想直接跳轉到所需的電子郵件地址,不需要接觸許可使用這樣的事情:

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

這並不需要接觸權限讀取電子郵件地址就像上面的雙重查詢方法。它還使得您無需爲用戶編寫用戶界面來爲具有多個電子郵件的聯繫人選擇適當的電子郵件地址,用戶在聯繫人應用程序中選擇特定的電子郵件,因此您只能得到一個結果。

光標回來了,除了像顯示名稱只是電子郵件地址相當多的列,儘管這僅是運行Android M的Nexus 5的驗證