Comment append de nouveaux contacts dans Android

J’ai écrit le code suivant pour append un nouveau contact dans l’annuaire Android, il fonctionne mais quand j’ouvre le menu de contact, je ne peux pas voir le nouveau contact ajouté. Quelqu’un peut-il m’aider à découvrir ce qui ne va pas ici?

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.toSsortingng()); setContentView(tv); } } } 

Ici, je publie un morceau de code que j’utilise pour append un nouveau contact. Ça fonctionne bien pour moi. J’espère que cela vous aidera.

  Ssortingng DisplayName = "XYZ"; Ssortingng MobileNumber = "123456"; Ssortingng HomeNumber = "1111"; Ssortingng WorkNumber = "2222"; Ssortingng emailID = "[email protected]"; Ssortingng company = "bad"; Ssortingng 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(); } 

Voici le code Intégrez-le selon vos besoins. J’espère que cela aidera.

Cela fonctionne très bien pour moi:

 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 } 

Ces exemples vont bien, je voulais souligner que vous pouvez obtenir le même résultat en utilisant une intention. L’intention ouvre l’application Contacts avec les champs déjà renseignés.

C’est à l’utilisateur de sauvegarder le nouveau contact créé.

Vous pouvez lire à ce sujet ici: 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 () vous donne la possibilité de voir le résultat.

J’ai remarqué le resultCode qui fonctionne sur les appareils> 5.0,

mais j’ai un Samsung plus ancien (<5) qui renvoie toujours RESULT_CANCELLED (0).

Ce que je comprends est le retour par défaut si une activité ne s’attend à rien retourner.

 @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(); } } } 

Ce n’est pas que les réponses ci-dessus sont incorrectes, mais je trouve ce code extrêmement facile à comprendre et par conséquent je le partage ici avec tout le monde. Et il y a aussi la vérification de l’autorisation WRITE_CONTACTS .

Voici le code complet pour append un numéro de téléphone, un email, un site Web, etc. à un contact existant.

 public static void addNumberToContact(Context context, Long contactRawId, Ssortingng 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, Ssortingng 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, Ssortingng 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, Ssortingng mimeType, Ssortingng whatToAdd, Ssortingng typeKey, int type, Ssortingng 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); } 

Il existe plusieurs bons articles sur le sujet sur le site dev2qa.com , à propos de l’API Contacts Provider :

Comment append un contact dans Android par programmation

Comment mettre à jour les contacts Android par programme

Comment faire pour obtenir la liste de contacts dans Android par programme

Les contacts sont stockés dans des fichiers SQLite .db dans un groupe de tables, la structure est discutée ici: Structure de la firebase database des contacts Android

Documentation Google officielle sur le fournisseur de contacts ici