2011-09-07 12 views
8

Sto facendo un'applicazione di messaggi di testo e voglio accedere ai contatti nella mia applicazione Android .come accedere ai contatti nel mio programma Android

Desidero accedere ai contatti come se fossero nella lista dei contatti effettiva. Quando selezionato, ho bisogno di tornare alla mia attività in cui posso inviare un SMS a quella persona. O è possibile accedere al database in cui sono memorizzati i contatti?

Il mio codice è il seguente:

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

mio LogCat assomiglia a questo:

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 

Qualcuno mi può aiutare?

controllo
+0

devo aggiungere le autorizzazioni – sajith

+0

ya è necessario aggiungere l'autorizzazione. –

risposta

13

uso di questo codice per prendere contatto:

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

grazie, ma come posso memorizzare il numero di contatto selezionato su una variabile – sajith

+0

controllare post modificato .... – swan

+0

Cosa succede se ci sono più di un numero per l'ID selezionato. Secondo il codice precedente, questo recupera il primo numero. Non c'è alcuna opzione per l'utente di scegliere quale numero vuole? – AnujAroshA

2

provare questo codice. memorizza tutti i contatti in 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){} 
} 

se si desidera memorizzare il contatto specifico utilizzare la condizione if.

+0

hasPhone restituisce il valore 1, ma si verifica un errore quando String phoneNumber = phones.getString (phones.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)); esegue, quale sarà il problema – sajith

+0

cosa significa "hasPhone restituisce il valore 1". non ricevendo il problema –

+0

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

Problemi correlati