tag studio example android contacts android-contacts

android - studio - Insertar una nueva intención de contacto



android tag example (8)

Para una de mis aplicaciones, necesito que el usuario seleccione uno de sus contactos existentes o cree uno nuevo. Elegir uno es claramente fácil de hacer con el siguiente código:

i = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); startActivityForResult(i, PICK_CONTACT_REQUEST );

Ahora quiero crear un nuevo contacto. Intenté usar ese código pero no activa el resultado de la actividad:

i = new Intent(Intent.ACTION_INSERT); i.setType(Contacts.CONTENT_TYPE); startActivityForResult(i, PICK_CONTACT_REQUEST);

El código anterior comenzará el formulario de contacto de adición. Luego, cuando lo valido, solo me pide que abra la lista de contactos y el método onActivityResult nunca se activa.

¿Podrías ayudarme a hacerlo funcionar?

Leí en algunos tableros que esto no era posible, y tuve que crear mi propio formulario para agregar contactos. ¿Podrías confirmar eso?

EDITAR: Problema resuelto. Mira mi respuesta


En Xamarin.forms y Xamarin.Android c #.

Android.Content.Intent intent = new Android.Content.Intent(Android.Content.Intent.ActionInsert); intent.SetType(Android.Provider.ContactsContract.Contacts.ContentType); intent.PutExtra(Android.Provider.ContactsContract.Intents.ExtraForceCreate, true); StartActivity(intent);


Finalmente encontré una solución, la comparto contigo. Eso es solo una solución para la versión de Android superior a 4.0.3 y sup. No funciona en 4.0 a 4.0.2.

i = new Intent(Intent.ACTION_INSERT); i.setType(Contacts.CONTENT_TYPE); if (Integer.valueOf(Build.VERSION.SDK) > 14) i.putExtra("finishActivityOnSaveCompleted", true); // Fix for 4.0.3 + startActivityForResult(i, PICK_CONTACT_REQUEST);


Prueba si usas Kotlin

fun Fragment.saveContact(name: String?, phone: String?) { if (name != null && phone != null) { val addContactIntent = Intent(Intent.ACTION_INSERT) addContactIntent.type = ContactsContract.Contacts.CONTENT_TYPE addContactIntent.putExtra(ContactsContract.Intents.Insert.NAME, name) addContactIntent.putExtra(ContactsContract.Intents.Insert.PHONE, phone) startActivity(addContactIntent) } }


Puede elegir si desea agregar el contacto automáticamente o abrir la actividad de agregar contacto con datos precargados:

/** * Open the add-contact screen with pre-filled info * * @param context * Activity context * @param person * {@link Person} to add to contacts list */ public static void addAsContactConfirmed(final Context context, final Person person) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); intent.putExtra(ContactsContract.Intents.Insert.NAME, person.name); intent.putExtra(ContactsContract.Intents.Insert.PHONE, person.mobile); intent.putExtra(ContactsContract.Intents.Insert.EMAIL, person.email); context.startActivity(intent); } /** * Automatically add a contact into someone''s contacts list * * @param context * Activity context * @param person * {@link Person} to add to contacts list */ public static void addAsContactAutomatic(final Context context, final Person person) { String displayName = person.name; String mobileNumber = person.mobile; String email = person.email; ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build()); // Names if (displayName != null) { ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName).build()); } // Mobile Number if (mobileNumber != null) { ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, mobileNumber) .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).build()); } // Email if (email != null) { ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Email.DATA, email) .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK).build()); } // Asking the Contact provider to create a new contact try { context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } catch (Exception e) { e.printStackTrace(); } Toast.makeText(context, "Contact " + displayName + " added.", Toast.LENGTH_SHORT) .show(); }


Usé la primera parte de la respuesta aceptada:

Intent i = new Intent(Intent.ACTION_INSERT); i.setType(ContactsContract.Contacts.CONTENT_TYPE); if (Build.VERSION.SDK_INT > 14) i.putExtra("finishActivityOnSaveCompleted", true); // Fix for 4.0.3 + startActivityForResult(i, 1);

ahora, en su resultado, puede obtener un número de teléfono y también un nombre, ya que es un problema y debería consultar dos tablas diferentes que están conectadas por las mismas identificaciones. Publicaré esta parte para que sea más fácil para todos:

@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == 1) { if (resultCode == RESULT_OK) { assert data != null; ContentResolver cr = getContentResolver(); Cursor cursor = cr.query(Objects.requireNonNull(data.getData()), null, null, null, null); if (cursor != null && cursor.moveToFirst()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {//Has phoneNumber Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); while (pCur != null && pCur.moveToNext()) { String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Log.v("SteveMoretz", "NAME : " + name + " phoneNo : " + phoneNo); } if (pCur != null) { pCur.close(); } } } else { Toast.makeText(getApplicationContext(), "User canceled adding contacts", Toast.LENGTH_SHORT).show(); } if (cursor != null) { cursor.close(); } } super.onActivityResult(requestCode, resultCode, data); }

Espero que esto ayude a alguien.


// Creates a new Intent to insert a contact Intent intent = new Intent(Intents.Insert.ACTION); // Sets the MIME type to match the Contacts Provider intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);

Si ya tiene detalles para el contacto, como un número de teléfono o una dirección de correo electrónico, puede insertarlos en la intención como información extendida. Para un valor clave, use la constante apropiada de Intents.Insert. La aplicación de contactos muestra los datos en su pantalla de inserción, lo que permite a los usuarios realizar más ediciones y adiciones.

private EditText mEmailAddress = (EditText) findViewById(R.id.email); private EditText mPhoneNumber = (EditText) findViewById(R.id.phone); /* * Inserts new data into the Intent. This data is passed to the * contacts app''s Insert screen */ // Inserts an email address intent.putExtra(Intents.Insert.EMAIL, mEmailAddress.getText()) /* * In this example, sets the email type to be a work email. * You can set other email types as necessary. */ .putExtra(Intents.Insert.EMAIL_TYPE, CommonDataKinds.Email.TYPE_WORK) // Inserts a phone number .putExtra(Intents.Insert.PHONE, mPhoneNumber.getText()) /* * In this example, sets the phone type to be a work phone. * You can set other phone types as necessary. */ .putExtra(Intents.Insert.PHONE_TYPE, Phone.TYPE_WORK);

Una vez que haya creado la intención, envíela llamando a startActivity ().

/* Sends the Intent */ startActivity(intent);

Nota: importar "intenciones" de "ContactsContract"


int INSERT_CONTACT_REQUEST=2; i = new Intent(Intent.ACTION_INSERT,Contacts.CONTENT_URI); startActivityForResult(i, INSERT_CONTACT_REQUEST);

protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if(requestCode == INSERT_CONTACT_REQUEST) { if (resultCode == RESULT_OK) { Toast.makeText().show(getApplicationContext(),"Added_Succesfully",Toast.LENGTH_SHORT); }else if(resultCode == RESULT_CANCELED) { Toast.makeText().show(getApplicationContext(),"Contacts Adding Error",Toast.LENGTH_SHORT); } } }


Intent intent = new Intent( ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, Uri.parse("tel:" + phoneNumber)); intent.putExtra(ContactsContract.Intents.EXTRA_FORCE_CREATE, true); startActivity(intent);

Este código puede ayudarte.