2012-03-28 11 views
18

Ich versuche, einen Kontakt meines Telefonbuchs direkt von meiner App zu aktualisieren. Ich kann die Kontakte hinzufügen und löschen, aber das Update tut nichts!Android - Aktualisieren Sie einen Kontakt

Nach dem Einfügen oder wenn ich die Kontakte packe, sammle ich die CONTACT_ID (Aka _ID).

Hier ist mein Code für das Update:

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() gibt mir den _ID Wert des aktuellen Kontakts. r.getFirstName() und r.getLastName() geben Sie mir den Namen des Kontakts. r.getPhoto() gibt mir sein Foto uri. Und schließlich r.getNumber() gibt mir seine Telefonnummer.

Die Log-Zeile gibt mir einen korrekten Wert von _ID, ich glaube nicht, dass das Problem von hier kommt. Habe ich etwas falsch gemacht?

Danke.

Grüße.

V.


ganze Quellcode:

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

Antwort

39

Schließlich fand ich, wie ein Kontakt zu aktualisieren, hier ist der Code der Update-Methode:

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

Das Feld id ist die rohe Kontakt-ID zurückgegeben, wenn Sie einen neuen Kontakt in die Datenbank einfügen. Hier ist der Code diese ID zu erhalten:

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

meine erste Frage prüfen, ob Sie mehr darüber wissen möchten, wie Sie einen Kontakt zum Einfügen/Löschen.

+0

Danke für deinen Code. Dein Code für das Bild funktioniert fast. Aber das Problem ist nach der Bearbeitung des Bildes es das Bild nur in Detailview Bild (native Kontakt) nicht in Listview Bild (native Kontakt) aktualisieren – AndroidRaji

+0

Wie Adresse, Stadt, Stadt zu aktualisieren. Bitte teilen Sie den Code – AndroidRaji

+0

Danke. Nach dem ganzen Tag hat mich dein Code gerettet. (Y) – activesince93

0

Für Kontakt Aktualisieren Sie beide ContactID und RawContact id haben müssen ... so während dieser Aktualisierung fügen auch als ein Wert in where Klausel/Auswahl args ..

so etwas wie dieses ..

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

Sorry, aber ich verstehe nicht.Wann und wo soll ich den Code benutzen? Mein Telefonbuch besteht aus früheren Kontakteinträgen (die der Benutzer vor der Installation der App gemacht hat) und Einträgen, die die App gemacht hat. Ich bearbeite meinen ersten Beitrag mit dem gesamten Quellcode. – Manitoba

3

Ich bin nicht sicher, ob das hilft Ihnen, jedoch fand ich einen Blog über den Unterschied zwischen contact_id und raw_contact_id:

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

In diesem Blog erklärt er gut wie die Kontakte api funktioniert und wenn ich es richtig verstehe, musst du die raw_contact_id verwenden, um deine Eingabe zu ändern. Vergessen Sie also die contact_id für die Aktualisierung und ändern Sie Ihre Aktualisierung, so dass der Eintrag raw_contact_id geändert wird. Ich würde grob schätzt, dass es in etwa so aussehen würde:

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

Ich hoffe, das hilft Ihnen, ein wenig und nochmals vielen Dank für Ihre Hilfe Form vor.

+0

Nun, ich habe versucht, Ihren Quellcode zu verwenden, aber es funktioniert nicht. Ich bin zu meinem vorherigen Code zurückgekehrt, der mir die RAW_CONTACT_ID gibt. Dann habe ich meinen SC mit deinem geändert. Aber nichts passiert ... – Manitoba

+0

Die einzige Sache, die mir in den Sinn kommt, ist, dass Sie möglicherweise ops.add (ContentProviderOperation.newUpdate (RawContacts.CONTENT_URI) anstelle von ops.add (ContentProviderOperation.newUpdate (Data.CONTENT_URI). Dies könnte löse vielleicht das Problem – Max

+0

Nein, funktioniert immer noch nicht ... – Manitoba

Verwandte Themen