2011-09-07 29 views
8

我在製作短信應用程序,並且想要訪問我的Android應用程序 中的聯繫人。如何訪問我的Android程序中的聯繫人

我想訪問聯繫人,就好像他們在實際聯繫人列表中的位置一樣。選擇時,我需要返回到我可以發送短信給該人的活動。還是有可能訪問存儲聯繫人的數據庫?

我的代碼如下所示:

String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 
String no = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

我logcat的是這樣的:

09-07 12:46:15.458: DEBUG/AndroidRuntime(473): Shutting down VM 
09-07 12:46:15.458: WARN/dalvikvm(473): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473): FATAL EXCEPTION: main 
09-07 12:46:15.478: ERROR/AndroidRuntime(473): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/0r1-512D3F3D533B/1 flg=0x1 (has extras) }} to activity {task.list/task.list.Msgactivity}: java.lang.IllegalArgumentException: column 'data1' does not exist 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.os.Looper.loop(Looper.java:123) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at dalvik.system.NativeStart.main(Native Method) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473): Caused by: java.lang.IllegalArgumentException: column 'data1' does not exist 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:99) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at task.list.Msgactivity.onActivityResult(Msgactivity.java:99) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2528) 
09-07 12:46:15.478: ERROR/AndroidRuntime(473):  ... 11 more 
09-07 12:46:15.489: WARN/ActivityManager(61): Force finishing activity task.list/.Msgactivity 

誰能幫助我?

+0

我是否必須添加權限 – sajith

+0

你需要添加權限。 –

回答

13

使用此代碼來接接觸:

Button button = (Button)findViewById(R.id.pickcontact); 

    button.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
       startActivityForResult(intent, PICK_CONTACT); 
      } 
     }); 



    @Override public void onActivityResult(int reqCode, int resultCode, Intent data){ super.onActivityResult(reqCode, resultCode, data); 

    switch(reqCode) 
    { 
     case (PICK_CONTACT): 
     if (resultCode == Activity.RESULT_OK) 
     { 
      Uri contactData = data.getData(); 
      Cursor c = managedQuery(contactData, null, null, null, null); 
      if (c.moveToFirst()) 
      { 
      String id = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); 

      String hasPhone = 
      c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 

      if (hasPhone.equalsIgnoreCase("1")) 
      { 
     Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null); 
      phones.moveToFirst(); 
      String cNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      // Toast.makeText(getApplicationContext(), cNumber, Toast.LENGTH_SHORT).show(); 
      setCn(cNumber); 
      } 
     } 
     } 
    } 
    } 
+0

謝謝,但我怎麼能將選定的聯繫號碼存儲到變量 – sajith

+0

檢查編輯過的帖子.... – swan

+0

如果選定的ID有多個號碼,會發生什麼情況。根據上面的代碼,這將檢索第一個數字。用戶沒有選擇他想要的號碼嗎? – AnujAroshA

2

試試這個代碼。這存儲了ArrayList中的所有聯繫人

ArrayList<HashMap<String,String>> contactData=new ArrayList<HashMap<String,String>>(); 
ContentResolver cr = getContentResolver(); 
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
while (cursor.moveToNext()) { 
    try{ 
    String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
    String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
    String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
    if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
     Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); 
     while (phones.moveToNext()) { 
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      HashMap<String,String> map=new HashMap<String,String>(); 
      map.put("name", name); 
      map.put("number", phoneNumber); 
      contactData.add(map); 
     } 
     phones.close(); 
    } 
}catch(Exception e){} 
} 

如果要存儲特定聯繫人,請使用if條件。

+0

hasPhone返回值1,但在String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))時發生錯誤;執行,將有什麼問題 – sajith

+0

這意味着「hasPhone返回值1」。沒有得到你的問題 –

+0

String hasPhone = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); – sajith

相關問題