2011-09-07 19 views
8

Estoy haciendo una aplicación de mensaje de texto y quiero acceder a los contactos en mi aplicación Android .cómo acceder a los contactos en mi programa de Android

Quiero acceder a los contactos como si estuvieran en la lista de contactos real. Cuando me seleccionen, necesito volver a mi actividad en la que pueda enviar un mensaje de texto a esa persona. ¿O es posible acceder a la base de datos en la que se almacenan los contactos?

Mi código se muestra a continuación:

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

Mi LogCat se parece a esto:

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 

¿Puede alguien ayudarme?

verificación
+0

tengo que agregar permisos – sajith

+0

ya no es necesario agregar el permiso. –

Respuesta

13

uso de este código para retirar contactos:

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

gracias, pero ¿cómo puedo almacenar el número de contacto seleccionado en una variable – sajith

+0

revisar la publicación editada ... – swan

+0

Qué ocurre si hay más de un número para la identificación seleccionada. Según el código anterior, este recupera el primer número. ¿No hay alguna opción para que el usuario elija qué número quiere? – AnujAroshA

2

prueba este código. esto almacena todos los contactos en el 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){} 
} 

si desea almacenar el contacto específico use la condición if.

+0

hasPhone devuelve el valor 1, pero se produce un error cuando String phoneNumber = phones.getString (phones.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)); ejecuta, cuál será el problema – sajith

+0

qué significa "tiene el teléfono devuelve el valor 1". no está obteniendo problema –

+0

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

Cuestiones relacionadas