Inserción mediante programación de nuevos contactos de Android en el teléfono

Estoy escribiendo una aplicación que permite al usuario eliminar contactos de su dispositivo Android y almacenarlos en una base de datos independiente. También deben ser capaces de restaurar los contactos a su teléfono, pero estoy teniendo problemas con esta parte. Recupero la información de contacto de mi base de datos y crear un objeto de contacto que contiene el ID de contacto, la clave de búsqueda, el nombre estructurado, la organización, una lista de matrices de objetos de teléfono (que contienen el número de teléfono y tipo), etc. Mi función para restaurar esa información en el teléfono se ve así:

public void addContact(Contact contact) { ContentValues values = new ContentValues(); values.put("contact_id", contact.getContactId()); values.put("lookup", contact.getLookupKey()); values.put("mimetype", StructuredName.CONTENT_ITEM_TYPE); values.put("data1", contact.getStructuredName().getDisplayName()); values.put("data2", contact.getStructuredName().getGivenName()); values.put("data3", contact.getStructuredName().getFamilyName()); values.put("data4", contact.getStructuredName().getPrefix()); values.put("data5", contact.getStructuredName().getMiddleName()); values.put("data6", contact.getStructuredName().getSuffix()); context.getContentResolver().insert(Data.CONTENT_URI, values); } 

Y, bueno, ahí es donde la aplicación se bloquea. He utilizado este método para insertar datos en mi base de datos sin ningún problema, y ​​puedo verificar que se está almacenando correctamente. Así que mi conjetura es que hay una manera mejor que esto para insertar contactos en el dispositivo, pero no tengo ni idea de lo que sería. ¿Podría alguien darme un ejemplo de crear e insertar un contacto programáticamente en el dispositivo del usuario? Yo estaría satisfecho incluso si pudiera ver un contacto con sólo un nombre de presentación que se está creando.

En caso de que importe, también traté de poner este código por encima de la inserción del nombre estructurado, pero en vano:

 values.put("_id", contact.getContactId()); values.put("lookup", contact.getLookupKey()); values.put("display_name", contact.getStructuredName().getDisplayName()); context.getContentResolver().insert(Contacts.CONTENT_URI, values); values.clear(); 

Editar: Aquí está mi registro de errores logcat para cuando la aplicación se bloquea:

 05-07 20:31:53.941: E/Trace(819): error opening trace file: No such file or directory (2) 05-07 20:34:39.035: D/AndroidRuntime(853): Shutting down VM 05-07 20:34:39.048: W/dalvikvm(853): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 05-07 20:34:39.197: E/AndroidRuntime(853): FATAL EXCEPTION: main 05-07 20:34:39.197: E/AndroidRuntime(853): java.lang.NullPointerException 05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Parcel.readException(Parcel.java:1431) 05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) 05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:420) 05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentResolver.insert(ContentResolver.java:866) 05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.contacts.ContactHandler.addContact(ContactHandler.java:58) 05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.StartPage$12.onClick(StartPage.java:542) 05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Handler.dispatchMessage(Handler.java:99) 05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Looper.loop(Looper.java:137) 05-07 20:34:39.197: E/AndroidRuntime(853): at android.app.ActivityThread.main(ActivityThread.java:5041) 05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invokeNative(Native Method) 05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invoke(Method.java:511) 05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 05-07 20:34:39.197: E/AndroidRuntime(853): at dalvik.system.NativeStart.main(Native Method) 

Referencia

 ContentValues values = new ContentValues(); values.put(Data.RAW_CONTACT_ID, 001); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); values.put(Phone.NUMBER, "1-800-GOOG-411"); values.put(Phone.TYPE, Phone.TYPE_CUSTOM); values.put(Phone.LABEL, "Nirav"); Uri dataUri = getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); 

Utilice el código anterior. http://developer.android.com/reference/android/provider/ContactsContract.Data.html

 ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) .withValue(Data.RAW_CONTACT_ID, rawContactId) .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) .withValue(Phone.NUMBER, "1-800-GOOG-411") .withValue(Phone.TYPE, Phone.TYPE_CUSTOM) .withValue(Phone.LABEL, "free directory assistance") .build()); getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.