2012-03-28 15 views
18

Sto tentando di aggiornare un contatto della mia rubrica direttamente dalla mia app. Sono in grado di aggiungere ed eliminare i contatti ma l'aggiornamento non fa nulla!Android - Aggiornamento di un contatto

Dopo l'inserimento o quando prendo i contatti, raccolgo CONTACT_ID (Aka _ID).

Ecco il mio codice per l'aggiornamento:

public void update(Relation r) 
{ 
    Log.e("", ""+r.getBook_id()); 
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

    Builder builder = ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI); 
    builder.withValue(RawContacts.ACCOUNT_TYPE, null); 
    builder.withValue(RawContacts.ACCOUNT_NAME, null); 
    ops.add(builder.build()); 

    // Name 
    builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
    builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())}); 
    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName()+ " " +r.getLastName()); 
    ops.add(builder.build()); 

    // Number 
    builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
    builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())}); 
    builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber()); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); 
    ops.add(builder.build()); 

    // Picture 
    try 
    { 
     Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(r.getPhoto())); 
     ByteArrayOutputStream image = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image); 
     builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
     builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())}); 
     builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); 
     ops.add(builder.build()); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    // Update 
    try 
    { 
     context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

r.getBook_id() mi dà il valore _ID del contatto corrente. r.getFirstName() e r.getLastName() dammi il nome del contatto. r.getPhoto() mi dà la sua foto uri. E infine r.getNumber() mi da il suo numero di telefono.

La riga di registro mi fornisce un valore corretto di _ID, non penso che il problema venga da qui. Ho fatto qualcosa di sbagliato?

Grazie.

Saluti.

V.


codice sorgente totale:

/** 
* Uses the Contacts API to load contacts from the phonebook. 
* 
*/ 
public class ContactUtils 
{ 
    static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.Contacts.STARRED, 
     ContactsContract.Contacts.TIMES_CONTACTED, 
     ContactsContract.Contacts.CONTACT_PRESENCE, 
     ContactsContract.Contacts.PHOTO_ID, 
     ContactsContract.Contacts.LOOKUP_KEY, 
     ContactsContract.Contacts.HAS_PHONE_NUMBER, 
    }; 

    private Activity context; 

    static final int CARD_LIMIT = 50; 

    /** 
    * Constructor 
    * 
    * @version 1.0 
    * @since 2012-03-28 
    * @param context Context of the running activity 
    */ 
    public ContactUtils(Activity context) 
    { 
     super(); 
     this.context = context; 
    } 

    /** 
    * Returns a list of all the contacts in the phonebook 
    * 
    * @version 1.0 
    * @since 2012-03-28 
    * @return Returns a list of all the contacts in the phonebook 
    */ 
    public ArrayList<Relation> loadContacts() 
    { 
     String select = "((" + ContactsContract.Contacts.DISPLAY_NAME + " NOTNULL) AND (" + ContactsContract.Contacts.HAS_PHONE_NUMBER + " == 1))"; 
     Cursor c = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
     context.startManagingCursor(c); 

     ArrayList<Relation> cList = new ArrayList<Relation>(); 
     int a = 0; 
     Relation relation; 
     while (c.moveToNext() && a<CARD_LIMIT) 
     { 
      relation = new Relation(); 
      relation.setBook_id(new Integer(c.getString(0)).intValue()); 

      String[] name_splitted = c.getString(1).split(" "); 
      relation.setFirstName(name_splitted[0]); 
      if (name_splitted.length > 1) relation.setLastName(name_splitted[1]); 

      ArrayList<String> numbers = getPhoneNumbers(c.getString(0)); 
      relation.setNumber(numbers.size() > 0 ? numbers.get(0) : ""); 

      relation.setConcept("Any"); 
      relation.setPhoto(loadContactPhoto(c) == null ? "android.resource://com.orange.rd.kramer/drawable/default_photo" : loadContactPhoto(c)); 

      cList.add(relation); 
      a++; 
     } 
     c.close(); 
     return cList; 
    } 

    /** 
    * Returns an uri pointing to the contact's photo 
    * 
    * @version 1.0 
    * @since 2012-03-28 
    * @param cursor Cursor on a specific contact 
    * @return Returns an uri pointing to the contact's photo 
    */ 
    private String loadContactPhoto(Cursor cursor) 
    { 
     if (cursor.getString(5) != null) 
     { 
      Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, cursor.getInt(0));   
      return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY).toString(); 
     } 
     return null; 
    } 

    /** 
    * Returns a list of all phone numbers that belong to the given contact 
    * 
    * @version 1.0 
    * @since 2012-03-28 
    * @param id Id of the given contact 
    * @return Returns a list of all phone numbers that belong to the given contact 
    */ 
    private ArrayList<String> getPhoneNumbers(String id) 
    { 
     ArrayList<String> phones = new ArrayList<String>(); 

     Cursor pCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 
     while (pCur.moveToNext()) 
     { 
      phones.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
     } 
     pCur.close(); 
     return(phones); 
    } 

    /** 
    * Inserts the given relation into the stock phone book 
    * 
    * @version 1.0 
    * @since 2012-03-28 
    * @param r Relation to be added into the stock phone book 
    */ 
    public void insert(Relation r) 
    { 
     ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
     int rawContactInsertIndex = ops.size(); 

     Builder builder = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI); 
     builder.withValue(RawContacts.ACCOUNT_TYPE, null); 
     builder.withValue(RawContacts.ACCOUNT_NAME, null); 
     ops.add(builder.build()); 

     // Name 
     builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
     builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
     builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName().replace(" ", "-")+ " " +r.getLastName().replace(" ", "-")); 
     ops.add(builder.build()); 

     // Number 
     builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
     builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
     builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber()); 
     builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); 
     ops.add(builder.build()); 

     // Picture 
     try 
     { 
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(r.getPhoto())); 
      ByteArrayOutputStream image = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image); 
      builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); 
      builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex); 
      builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
      builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); 
      ops.add(builder.build()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     // Add the new contact 
     try 
     { 
      context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     String select = "(" + ContactsContract.Contacts.DISPLAY_NAME + " == \"" +r.getFirstName().replace(" ", "-")+ " " +r.getLastName().replace(" ", "-")+ "\")"; 
     Cursor c = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
     context.startManagingCursor(c); 

     if (c.moveToNext()) 
     { 
      r.setBook_id(new Integer(c.getString(0)).intValue()); 
     } 
     else 
     { 
      r.setBook_id(-1); 
     } 
    } 

    /** 
    * Updates the given relation in the stock phone book 
    * 
    * @version 1.0 
    * @since 2012-03-28 
    * @param r Relation to be updated in the stock phone book 
    */ 
    public void update(Relation r) 
    { 
     Log.e("", ""+r.getBook_id()); 
     ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

     Builder builder = ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI); 
     builder.withValue(RawContacts.ACCOUNT_TYPE, null); 
     builder.withValue(RawContacts.ACCOUNT_NAME, null); 
     ops.add(builder.build()); 

     // Name 
     builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
     builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())}); 
     builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, r.getFirstName().replace(" ", "-")+ " " +r.getLastName().replace(" ", "-")); 
     ops.add(builder.build()); 

     // Number 
     builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
     builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())}); 
     builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
     builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, r.getNumber()); 
     builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK); 
     ops.add(builder.build()); 

     // Picture 
     try 
     { 
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(r.getPhoto())); 
      ByteArrayOutputStream image = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image); 
      builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
      builder.withSelection(ContactsContract.Data._ID, new String[]{String.valueOf(r.getBook_id())}); 
      builder.withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 
      builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); 
      ops.add(builder.build()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     // Update 
     try 
     { 
      context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Deletes the given relation from the stock phone book 
    * 
    * @version 1.0 
    * @since 2012-03-28 
    * @param r Relation to be removed from the stock phone book 
    */ 
    public void delete(Relation r) 
    { 
     Cursor pCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{""+r.getBook_id()}, null); 
     while (pCur.moveToNext()) 
     { 
      String lookupKey = pCur.getString(pCur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); 
      Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); 
      context.getContentResolver().delete(uri, null, null); 
     } 
    } 
} 

risposta

39

Infine, ho trovato come aggiornare un contatto, ecco il codice del metodo di aggiornamento:

public void update() 
    {  
     int id = 1; 
     String firstname = "Contact's first name"; 
     String lastname = "Last name"; 
     String number = "000 000 000"; 
     String photo_uri = "android.resource://com.my.package/drawable/default_photo"; 

     ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

     // Name 
     Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
     builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{String.valueOf(id), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}); 
     builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastname); 
     builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstname); 
     ops.add(builder.build()); 

     // Number 
     builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
     builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?"+ " AND " + ContactsContract.CommonDataKinds.Organization.TYPE + "=?", new String[]{String.valueOf(id), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_HOME)}); 
     builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number); 
     ops.add(builder.build()); 


     // Picture 
     try 
     { 
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.parse(photo_uri)); 
      ByteArrayOutputStream image = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG , 100, image); 

      builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
      builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{String.valueOf(id), ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE}); 
      builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, image.toByteArray()); 
      ops.add(builder.build()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     // Update 
     try 
     { 
      getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

Il campo id è il contatto id grezzo restituito quando si inserisce un nuovo contatto nel database. Ecco il codice per ottenere questo id:

ContentProviderResult[] res; 
    try 
    { 
     res = KramerApplication.getInstance().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     if (res != null && res[0] != null) 
     { 
      String uri = res[0].uri.getPath().substring(14); 
      r.setBook_id(new Integer(uri).intValue()); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

leggi la mia prima domanda, se volete sapere di più su come inserire/eliminare un contatto.

+0

Grazie per il tuo codice. Il tuo codice per l'immagine funziona quasi. Ma il problema è dopo aver modificato l'immagine si aggiorna l'immagine solo in picture detailview (contatto nativo) non in listview picture (contatto nativo) – AndroidRaji

+0

Come aggiornare l'indirizzo, città, città. si prega di condividere il codice – AndroidRaji

+0

Grazie. Dopo aver trascorso un'intera giornata, il tuo codice mi ha salvato. (Y) – activesince93

0

per l'aggiornamento dei contatti è necessario avere sia contactID e RawContact id ... così, mentre l'aggiornamento aggiungere questo anche come un valore in dove argomento/selezione args ..

qualcosa di simile ..

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

     //------------------------------------------------------ Names 

     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
       .withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactId) 
       .withValue(ContactsContract.Data.MIMETYPE, 
         ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
         .withValue(ContactsContract.CommonDataKinds.StructuredName.PREFIX, data.getTitle()) 
         .withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, data.getSuffix()) 
         .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, data.getFirstName()) 
         .withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, data.getMiddleName()) 
         .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, data.getSuffix()) 
         .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, data.getFirstName()+" "+data.getMiddleName()).build()); 
+0

Scusa, ma non capisco.Quando e dove dovrei usare quel codice? La mia rubrica è composta da precedenti voci di contatto (che l'utente ha fatto prima di installare l'app) e voci create dall'app. Modificherò il mio primo post con l'intero codice sorgente. – Manitoba

3

Non sono sicuro se questo ti aiuta, però ho trovato un blog sulla differenza tra contact_id e raw_contact_id:

http://android-contact-id-vs-raw-contact-id.blogspot.de/

In questo blog ci spiega bene come funziona l'API di contatti e, se ho capito bene, devi utilizzare raw_contact_id per modificare la tua voce. Quindi dimentica contact_id per l'aggiornamento e modifica l'aggiornamento in modo che venga modificata la voce raw_contact_id. Vorrei circa immagino che sarebbe simile a questa:

ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
.withSelection(RawContacts._ID + "=?", new String[]{entertheraw_contact_id}) 
.withValue(StructuredName.DISPLAY_NAME, "Lost Symbol Characters") 
.build()); 
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

Spero che questo ti aiuta un po 'e vi ringrazio ancora per il vostro modulo di aiuto prima.

+0

Bene, ho provato a usare il codice sorgente ma non funziona. Sono tornato al mio codice precedente che mi fornisce RAW_CONTACT_ID. Poi ho modificato la mia SC con la tua. Ma non succede nulla ... – Manitoba

+0

L'unica cosa che mi viene in mente è forse usare ops.add (ContentProviderOperation.newUpdate (RawContacts.CONTENT_URI) invece di ops.add (ContentProviderOperation.newUpdate (Data.CONTENT_URI). Questo potrebbe risolva forse il problema – Max

+0

No, ancora non funziona ... – Manitoba

Problemi correlati