2012-03-28 16 views
18

Estoy tratando de actualizar un contacto de mi directorio directamente desde mi aplicación. ¡Puedo agregar y eliminar los contactos, pero la actualización simplemente no hace nada!Android - Actualizar un contacto

Después del inserto o cuando agarro los contactos, recojo el CONTACT_ID (Aka _ID).

Aquí está mi código para la actualización:

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() me da el valor _ID del contacto actual. r.getFirstName() y r.getLastName() dame el nombre del contacto. r.getPhoto() me da su foto uri. Y finalmente r.getNumber() me da su número de teléfono.

La línea de registro me da un valor correcto de _ID, no creo que el problema provenga de aquí. ¿Hice algo mal?

Gracias.

Atentamente.

V.


código fuente entero:

/** 
* 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); 
     } 
    } 
} 

Respuesta

39

Finalmente, encontré la forma de actualizar un contacto, aquí está el código del método de actualización:

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

El campo id es el id de contactos prima devuelve cuando se inserta un nuevo contacto en la base de datos. Aquí está el código para obtener este 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(); 
    } 

comprobar mi primera pregunta si desea saber más acerca de cómo insertar/eliminar un contacto.

+0

Gracias por nuestro código. Tu código para la imagen funciona casi. Pero el problema es después de editar la imagen, actualizar la imagen solo en la imagen de vista detallada (contacto nativo) no en la vista de lista (contacto nativo) – AndroidRaji

+0

Cómo actualizar la dirección, ciudad, ciudad. por favor comparta el código – AndroidRaji

+0

Gracias. Después de pasar todo el día, su código me salvó. (Y) – activesince93

0

para la actualización de contactos es necesario tener tanto ContactId y RawContact Identificación ... así que mientras que la actualización de añadir esto también como un valor en donde cláusula/selección args ..

algo como esto ..

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

Lo siento, pero no entiendo.¿Cuándo y dónde se supone que debo usar ese código? Mi directorio está hecho de entradas de contacto anteriores (que el usuario hizo antes de instalar la aplicación) y las entradas que realizó la aplicación. Editaré mi primera publicación con todo el código fuente. – Manitoba

3

No estoy seguro de si esto le ayuda, sin embargo he encontrado un blog sobre la diferencia entre contact_id y raw_contact_id:

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

En este blog se explica bien cómo funciona la API de contactos y si la entiendo correctamente, debe usar el raw_contact_id para cambiar su entrada. Así que olvide el contact_id para actualizar y cambie su actualización para que la entrada raw_contact_id se modifique. Yo más o menos supongo que sería algo como esto:

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); 

espero que esto ayude un poco y gracias de nuevo por su forma de ayuda antes.

+0

Bueno, he intentado usar tu código fuente pero no funciona. He cambiado a mi código anterior que me da RAW_CONTACT_ID. Luego modifiqué mi SC con la tuya. Pero no pasa nada ... – Manitoba

+0

Lo único que me viene a la mente, es que tal vez use ops.add (ContentProviderOperation.newUpdate (RawContacts.CONTENT_URI) en lugar de ops.add (ContentProviderOperation.newUpdate (Data.CONTENT_URI). Esto podría resuelva quizás el problema – Max

+0

No, aún no funciona ... – Manitoba

Cuestiones relacionadas