Android – 更新联系人

我试图直接从我的应用更新我的电话簿的联系人。 我能够添加和删除联系人,但更新只是无能为力!

插入后或抓取联系人后,我收集CONTACT_ID(Aka _ID)。

这里是我的代码更新:

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()给我当前联系人的_ID值。 r.getFirstName()r.getLastName()给我联系人的名字。 r.getPhoto()给我他的照片uri。 最后r.getNumber()给我他的电话号码。

Log行给了我一个正确的_ID值,我不认为这个问题来自这里。 我做错什么了吗?

谢谢。

问候。

V.


整个源代码:

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

Related of "Android – 更新联系人"

最后,我发现如何更新联系人,下面是更新方法的代码:

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

字段id是将新联系人插入数据库时​​返回的原始联系人ID。 以下是获取此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(); } 

检查我的第一个问题,如果你想知道更多关于如何插入/删除联系人。

我不确定这是否有助于您,但是我find了关于contact_id和raw_contact_id之间区别的博客:

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

在这个博客中,他解释了如何联系人api工作,如果我正确理解你必须使用raw_contact_id来改变你的条目。 所以忘记更新的contact_id并更改您的更新,以便更改raw_contact_id条目。 我大致猜测它会看起来像这样:

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

我希望这可以帮助你一点,再次感谢你的帮助表格。

对于更新联系人,你需要同时具有contactIdRawContact id …所以在更新的同时,还要将其作为where子句/select参数的值

像这样的东西

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