2010-02-05 3 views
4

En essayant d'ajouter un numéro de téléphone à un contact déjà existant sur un téléphone Droid. Le faire en même temps que je crée un contact est trivial, car la référence arrière que je fournis est simplement 0 lors de la création d'un ContentProviderOperation. Mais en essayant de trouver le backreference par l'interrogation d'un nom d'affichage comme cela ne fonctionne pas:Ajouter numéro à contacter sur Android 2.0

Cursor rawContactsReferenceCursor = 
      contentResolver.query(Data.CONTENT_URI, 
        new String[]{Data.RAW_CONTACT_ID}, 
        Data.DISPLAY_NAME+"=\""+displayName+"\"", null, null); 

Pendant que je reçois un identifiant de contact brut, le code suivant génère juste un IndexOutOfBoundException (rawConcactReferenceID est la variable que je suis de la demande précédente):

ArrayList<ContentProviderOperation> op_list = 
    new ArrayList<ContentProviderOperation>(); 
op_list.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
    .withValueBackReference(Data.RAW_CONTACT_ID, rawConcactReferenceID) 
    .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) 
    .withValue(Phone.NUMBER, testNumber) 
    .withValue(Phone.TYPE, Phone.TYPE_CUSTOM) 
    .withValue(Phone.LABEL, testLabel) 
    .build()); 
ContentProviderResult[] result = 
    contentResolver.applyBatch(ContactsContract.AUTHORITY, op_list); 

Le grand défi est un manque énorme de bonne documentation. Je serais très satisfait de mettre la main sur des copypastas pour étudier.

Cheers,

Répondre

4

J'ai trouvé une réponse. Ce n'est pas atomique si vous voulez ajouter plusieurs choses tout de suite, mais bon, qui a besoin d'atomicité stupide?

ContentValues values = new ContentValues(); 
values.put(Data.RAW_CONTACT_ID, new Integer(contactId).intValue()); 
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 
values.put(Phone.NUMBER, dataValue); 
values.put(Phone.TYPE, Phone.TYPE_CUSTOM); 
values.put(Phone.LABEL, customLabel); 
Uri dataUri = getContentResolver().insert(Data.CONTENT_URI, values); 
2

J'ai eu un problème similaire avec les adresses e-mail. Voici la solution que j'ai utilisée qui a fonctionné:

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
    .withValue(Data.RAW_CONTACT_ID, id) 
    .withValue(Email.DATA, value) 
    .withValue(Email.MIMETYPE, .Email.CONTENT_ITEM_TYPE) 
    .withValue(Email.LABEL, label) 
    .withValue(Email.TYPE, Email.TYPE_CUSTOM) 
    .build()); 
ContentProviderResult[] res = cr.applyBatch(ContactsContract.AUTHORITY, ops); 

La même solution devrait fonctionner pour les numéros de téléphone.

Questions connexes