J'écris une application qui écrit des contacts dans la carte SIM d'un téléphone Android. Je suis bloqué au point où le numéro de téléphone est ajouté: une exception se produit sans raison apparente.Android: comment ajouter un contact à la carte SIM en utilisant le SDK?
Voici un extrait de code.
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContactsEntity;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.RawContacts.Entity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
[...]
try{
// add a row to the RawContacts table
ContentValues values = new ContentValues();
values.put(RawContacts.ACCOUNT_TYPE, "com.anddroid.contacts.sim");
values.put(RawContacts.ACCOUNT_NAME, "SIM");
Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);
// get the ID of the newly-added line
long rawContactId = ContentUris.parseId(rawContactUri);
// add a "name" line to the Data table, linking it to the new RawContact
// with the CONTACT_ID column
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.DISPLAY_NAME, "Name");
cr.insert(Data.CONTENT_URI, values);
// this insert succeeds
// add a "phone" line to the Data table, linking it to the new RawContact
// with the CONTACT_ID column
values.clear();
values.put(Data.CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, "+12345678901");
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
cr.insert(Data.CONTENT_URI, values);
// this insert fails with a NullPointerException
}
catch(Exception e){
String xx=e.toString();
System.out.println(xx);
}
L'application dispose des autorisations android.permission.READ_CONTACTS et android.permission.WRITE_CONTACTS. Le téléphone affiche un contact avec le nom mais pas de téléphone (d'ailleurs, l'ajout du téléphone à ce contact en utilisant l'interface utilisateur normale entraîne l'ajout d'un nouveau contact, avec nom et téléphone, et l'ancien contact avec le nom uniquement) .
Une idée pourquoi la troisième insertion (la deuxième dans le tableau de données) échoue, alors que les 2 précédentes (1 dans RawContacts et 1 dans Data) réussissent?
Ça va vraiment vous aider si vous postez la trace de la pile d'exceptions aussi – ognian
Vous voulez dire, mettre un point d'arrêt dans l'instruction catch, et coller la pile trace lorsque le point d'arrêt est atteint (c'est-à-dire que l'exception a été interceptée)? Pouvez-vous voir quelle fonction a jeté l'exception de cela? Toutefois, le remplacement Data.CONTACT_ID avec Data.RAW_CONTACT_ID résolu. – user377486