2011-05-02 12 views
8

Me gustaría elegir un correo electrónico de la lista de contactos. Elegir un contacto no es lo suficientemente bueno, porque un contacto puede tener varios correos electrónicos.intento de correo electrónico de recolección de Android

Utilizando la demostración de la API, pude elegir un contacto, un número de teléfono e incluso una dirección. Ejemplo:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 
// OR 
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
// OR 
intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); 

pero, cuando se trata de elegir un correo electrónico

intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); 

consigo excepción actividad no encontrado.

¿Alguna idea sobre cómo elegir un correo electrónico de todos los correos electrónicos de los contactos?

Gracias. Alik.

Actualización (2011/05/02): Se encontró otra manera de elegir cosas de los contactos, pero aún así el selector de correo electrónico no está registrado para el intento.

de Trabajo:

new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI); 
new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI); 

NO trabajo:

new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); 
+1

¿Ha encontrado una solución a esto? Crear un diálogo personalizado, como sugieren las respuestas, es una solución muy fea. – Thrakbad

Respuesta

1

No he probado específicamente para utilizar un selector, pero bucle a través de nuestra memoria caché de los contactos y encontrar todos los datos de contacto con un tipo MIME de Email.CONTENT_ITEM_TYPE.

Luego creamos un cuadro de diálogo para que el usuario de let seleccione la dirección de correo electrónico que quiere usar, y pasamos esa dirección de correo electrónico a la aplicación de correo electrónico del usuario, p.

final Intent emailIntent = new Intent(Intent.ACTION_SEND); 
    emailIntent.putExtra(Intent.EXTRA_STREAM, "Some text"); 

    Builder builder = new Builder(this); 
    builder.setTitle("Choose email"); 
    builder.setItems(emailAddressesArray, new DialogInterface.OnClickListener() 
    { 
    @Override 
    public void onClick(DialogInterface dialog, int which) 
    { 
     String address = emailAddresses.get(emailAddressesArray[which]); 
     sLog.user("User selected e-mail: " + address); 
     emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{address}); 
     startExternalActivity(emailIntent); 
    } 
    }); 
    builder.show(); 
0

Aquí hay un poco de muestra de código para mostrar todas las direcciones de correo electrónico en la lista de contactos para el usuario y que les permita seleccionar una sola (que luego se introduce en un EditText con el id de R.id. youredittextid).

Nota: Esta es una manera bastante ineficiente para hacer esto, y causar un retraso si usted tiene un montón de contactos. Pero todo el código necesario está aquí; personalizar como mejor le parezca ...

 // We're going to make up an array of email addresses 
     final ArrayList<HashMap<String, String>> addresses = new ArrayList<HashMap<String, String>>(); 

     // Step through every contact 
     final ContentResolver cr = getContentResolver(); 
     final Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
     while (cursor.moveToNext()) 
     { 
      final String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      final String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      // Pull out every email address for this particular contact 
      final Cursor emails = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 
              ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 
      while (emails.moveToNext()) 
      { 
       // Add email address to our array 
       final String strEmail = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

       final HashMap<String, String> email = new HashMap<String, String>(); 
       email.put("Name", contactName); 
       email.put("Email", strEmail); 

       addresses.add(email); 
      } 
      emails.close(); 
     } 

     // Make an adapter to display the list 
     SimpleAdapter adapter = new SimpleAdapter(this, addresses, android.R.layout.two_line_list_item, 
                new String[] { "Name", "Email" }, 
                new int[] { android.R.id.text1, android.R.id.text2 }); 

     // Show the list and let the user pick an email address 
     new AlertDialog.Builder(this) 
      .setTitle("Select Recipient") 
      .setAdapter(adapter, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 

       EditText e = (EditText)findViewById(R.id.youredittextid); 
       HashMap<String, String> email = addresses.get(which); 
       e.setText(email.get("Email")); 

       dialog.dismiss(); 
      } 
      }).create().show(); 
+0

funciona como el encanto, gracias a jeff – Archana

1

usted tiene que utilizar la siguiente constante (no CONTENT_ITEM_TYPE):

intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE); 
+0

esto no funciona en api's de nivel inferior como pan de jengibre – Hades

0

Un hilo viejo, pero ... Esta información podría ser útil a alguien. Cuando inicia un Intento con Intent.ACTION_PICK, está intentando invocar la actividad "Selector de contactos", que generalmente es proporcionada por la aplicación Contactos/Agenda.

La última versión de la aplicación Contactos Vanilla (Google) (Android 4.4.4) tiene Email.CONTENT_ITEM_TYPE para tipo mimet en su filtro de intención, por lo que debe responder a dicho intento, tal como lo hizo. No estoy seguro, pero parece que Contact Picker para versiones anteriores (ICS, JB) no tenía esto en sus filtros de intención.

En resumen, esta intención debería funcionar en KK con los Contactos de vanilla instalados, y no debería funcionar en versiones anteriores de Android.

0

perfecto estado de funcionamiento:

Intent intent = new Intent(Intent.ACTION_PICK); 
intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE); 
startActivityForResult(intent, 1); 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 
       Uri contactData = data.getData(); 
       Cursor cursor = getActivity().managedQuery(contactData, null, null, null, null); 
       cursor.moveToFirst(); 
       String email = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
       editText.setText(email); 
      } 


     } 
} 
+0

¿En qué dispositivo? –

+0

Probé con Nexus 5 y MI3. – Shubham

+0

versión de Android 5? –

Cuestiones relacionadas