2010-06-27 5 views
9

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?

+0

Ça va vraiment vous aider si vous postez la trace de la pile d'exceptions aussi – ognian

+1

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

Répondre

1

Data.CONTACT_ID doit être remplacé par Data.RAW_CONTACT_ID

2

Je reproduit celui-ci sur mon système, mais le contact sont effacées dès que les mobiles signifie que les réenclenchement contacts économisent sur la carte SIM temporaire de mobile. Est-ce la même chose qui se passe de votre côté ou il me manque quelque chose. J'utilise la simulation 3G.

Cordialement

+1

Salut Rohit. En fait, la même chose arrive ici. Apparemment, la table RawContacts est synchronisée avec le répertoire SIM au démarrage, mais y accéder n'est pas la même chose que d'accéder au répertoire SIM actuel. Je voudrais savoir comment le faire, ou au moins comment déclencher une resynchronisation entre le répertoire SIM et RawContacts ... – user377486

+0

avez-vous trouvé une solution? – UnknownJoe

4
values.put(RawContacts.ACCOUNT_TYPE, "com.anddroid.contacts.sim"); 

anddroid? Je n'ai pas regardé le reste, mais cela pourrait valoir la peine de supprimer un 'd'

Questions connexes