Cómo agregar nuevos contactos en Android

He escrito el siguiente código para agregar un nuevo contacto en la guía telefónica de Android, está funcionando, pero cuando abro el menú de contacto, no puedo ver el nuevo contacto agregado. ¿Alguien puede ayudarme a descubrir qué está mal aquí?

import android.app.Activity; import android.os.Bundle; import android.content.ContentResolver; import android.content.ContentValues; import android.provider.ContactsContract; import android.widget.TextView; import android.widget.Toast; public class AddContacts extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { ContentResolver cr = this.getContentResolver(); ContentValues cv = new ContentValues(); cv.put(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, "New Name"); cv.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "1234567890"); cv.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); cr.insert(ContactsContract.RawContacts.CONTENT_URI, cv); Toast.makeText(this, "Contact added", Toast.LENGTH_LONG).show(); } catch(Exception e) { TextView tv = new TextView(this); tv.setText(e.toString()); setContentView(tv); } } } 

Aquí estoy publicando un fragmento de código que uso para agregar un nuevo contacto. Funciona bien para mí. Espero que te ayude.

  String DisplayName = "XYZ"; String MobileNumber = "123456"; String HomeNumber = "1111"; String WorkNumber = "2222"; String emailID = "email@nomail.com"; String company = "bad"; String jobTitle = "abcd"; 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()); } //------------------------------------------------------ Home Numbers if (HomeNumber != 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, HomeNumber) .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME) .build()); } //------------------------------------------------------ Work Numbers if (WorkNumber != 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, WorkNumber) .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK) .build()); } //------------------------------------------------------ Email if (emailID != 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, emailID) .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK) .build()); } //------------------------------------------------------ Organization if (!company.equals("") && !jobTitle.equals("")) { ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company) .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, jobTitle) .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) .build()); } // Asking the Contact provider to create a new contact try { getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } catch (Exception e) { e.printStackTrace(); Toast.makeText(myContext, "Exception: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } 

Aquí está el código. Integre de acuerdo a su necesidad. Espero que ayude

Esto está funcionando bien para mí:

 ArrayList ops = new ArrayList(); int rawContactInsertIndex = ops.size(); ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) .withValue(RawContacts.ACCOUNT_TYPE, null) .withValue(RawContacts.ACCOUNT_NAME, null).build()); ops.add(ContentProviderOperation .newInsert(Data.CONTENT_URI) .withValueBackReference(Data.RAW_CONTACT_ID,rawContactInsertIndex) .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) .withValue(StructuredName.DISPLAY_NAME, "Vikas Patidar") // Name of the person .build()); ops.add(ContentProviderOperation .newInsert(Data.CONTENT_URI) .withValueBackReference( ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) .withValue(Phone.NUMBER, "9999999999") // Number of the person .withValue(Phone.TYPE, Phone.TYPE_MOBILE).build()); // Type of mobile number try { ContentProviderResult[] res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } catch (RemoteException e) { // error } catch (OperationApplicationException e) { // error } 

Estos ejemplos están bien, quería señalar que puede lograr el mismo resultado utilizando un Intento. El bash abre la aplicación de contactos con los campos que proporcionó ya completados.

Depende del usuario guardar el contacto recién creado.

Puede leer sobre esto aquí: https://developer.android.com/training/contacts-provider/modify-data.html

 Intent contactIntent = new Intent(ContactsContract.Intents.Insert.ACTION); contactIntent.setType(ContactsContract.RawContacts.CONTENT_TYPE); contactIntent .putExtra(ContactsContract.Intents.Insert.NAME, "Contact Name") .putExtra(ContactsContract.Intents.Insert.PHONE, "5555555555"); startActivityForResult(contactIntent, 1); 

startActivityForResult () te da la oportunidad de ver el resultado.

Me di cuenta de que resultCode funciona en dispositivos> 5.0

pero tengo un Samsung anterior (<5) que siempre devuelve RESULT_CANCELLED (0).

Lo que entiendo es la devolución predeterminada si una actividad no espera devolver nada.

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (requestCode == 1) { if (resultCode == Activity.RESULT_OK) { Toast.makeText(this, "Added Contact", Toast.LENGTH_SHORT).show(); } if (resultCode == Activity.RESULT_CANCELED) { Toast.makeText(this, "Cancelled Added Contact", Toast.LENGTH_SHORT).show(); } } } 

No es que las respuestas anteriores sean incorrectas, pero considero que este código es extremadamente fácil de entender y, por lo tanto, lo estoy compartiendo aquí con todos. Y también está el cheque para el permiso WRITE_CONTACTS .

Aquí está el código completo de cómo agregar un número de teléfono, correo electrónico, sitio web, etc. a un contacto existente.

 public static void addNumberToContact(Context context, Long contactRawId, String number) throws RemoteException, OperationApplicationException { addInfoToAddressBookContact( context, contactRawId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_OTHER, number ); } public static void addEmailToContact(Context context, Long contactRawId, String email) throws RemoteException, OperationApplicationException { addInfoToAddressBookContact( context, contactRawId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Email.ADDRESS, ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_OTHER, email ); } public static void addURLToContact(Context context, Long contactRawId, String url) throws RemoteException, OperationApplicationException { addInfoToAddressBookContact( context, contactRawId, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Website.URL, ContactsContract.CommonDataKinds.Website.TYPE, ContactsContract.CommonDataKinds.Website.TYPE_OTHER, url ); } private static void addInfoToAddressBookContact(Context context, Long contactRawId, String mimeType, String whatToAdd, String typeKey, int type, String data) throws RemoteException, OperationApplicationException { if(ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_DENIED) { return; } ArrayList ops = new ArrayList<>(); ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValue(ContactsContract.Data.RAW_CONTACT_ID, contactRawId) .withValue(ContactsContract.Data.MIMETYPE, mimeType) .withValue(whatToAdd, data) .withValue(typeKey, type) .build()); getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } 

Hay varios buenos artículos sobre el tema en el sitio dev2qa.com , sobre la API del Contacts Provider :

Cómo agregar un contacto en Android mediante progtwigción

Cómo actualizar eliminar contactos de Android mediante progtwigción

Cómo obtener la lista de contactos en Android mediante progtwigción

Los contactos se almacenan en archivos .db de SQLite en varias tablas, la estructura se trata aquí: Estructura de la base de datos de contactos de Android

Documentación oficial de Google sobre el proveedor de contactos aquí