Android的 - 更新联系人 [英] Android - Update a contact

查看:122
本文介绍了Android的 - 更新联系人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想更新我的手机直接预订从我的应用程序中的联系人。我能添加和删除的联系人,但在更新少了点什么!

在插入或当我抢的接触,我收集CONTACT_ID(又名_ID)。

下面是我的code的更新:

 公共无效更新(关系R)
{
    Log.e(,+ r.getBook_id());
    ArrayList的< ContentProviderOperation> OPS =新的ArrayList< ContentProviderOperation>();

    建设者建设者= ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI);
    builder.withValue(RawContacts.ACCOUNT_TYPE,NULL);
    builder.withValue(RawContacts.ACCOUNT_NAME,NULL);
    ops.add(builder.build());

    // 名称
    建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
    builder.withSelection(ContactsContract.Data._ID,新的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());

    // 数
    建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
    builder.withSelection(ContactsContract.Data._ID,新的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());

    // 图片
    尝试
    {
        位图的位图= MediaStore.Images.Media.getBitmap(context.getContentResolver(),Uri.parse(r.getPhoto()));
        ByteArrayOutputStream形象=新ByteArrayOutputStream();
        bitmap.com preSS(Bitmap.Com pressFormat.JPEG,100,图像);
        建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
        builder.withSelection(ContactsContract.Data._ID,新的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());
    }
    赶上(例外五)
    {
        e.printStackTrace();
    }

    //更新
    尝试
    {
        。context.getContentResolver()applyBatch(ContactsContract.AUTHORITY,OPS);
    }
    赶上(例外五)
    {
        e.printStackTrace();
    }
}
 

r.getBook_id()给我当前联系人的_ID值。 r.getFirstName() r.getLastName()给我联系人的姓名。 r.getPhoto()给了我他的照片URI。 最后 r.getNumber()给了我他的电话号码。

日志行给我_ID的正确值,我不认为这个问题来自于这里。 难道我做错了什么?

感谢。

问候。


全源$ C ​​$ C:

  / **
 *使用Contacts API来装载从电话簿联系人。
 *
 * /
公共类ContactUtils
{
    静态最终的String [] CONTACTS_SUMMARY_PROJECTION =新的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,
    };

    私人活动范围内;

    静态最终诠释CARD_LIMIT = 50;

    / **
     *构造函数
     *
     * @version 1.0
     * @Since 2012-03-28
     * @参数范围内的运行活动的背景下
    * /
    公共ContactUtils(活动范围内)
    {
        超();
        this.context =背景;
    }

    / **
     *返回在电话簿中的所有联系人的列表
     *
     * @version 1.0
     * @Since 2012-03-28
     * @返回返回电话簿中的所有联系人的列表
    * /
    公众的ArrayList<关联&​​GT; loadContacts()
    {
        串选择=((+ ContactsContract.Contacts.DISPLAY_NAME +NOTNULL)AND(+ ContactsContract.Contacts.HAS_PHONE_NUMBER +== 1));
        光标C = context.getContentResolver()查询(ContactsContract.Contacts.CONTENT_URI,CONTACTS_SUMMARY_PROJECTION,选择,空,ContactsContract.Contacts.DISPLAY_NAME +分页中局部ASC)。
        context.startManagingCursor(C);

        ArrayList的<关联&​​GT; CLIST =新的ArrayList<关联&​​GT;();
        INT一个= 0;
        关联关系:
        而(c.moveToNext()&安培;&安培;一所述&; CARD_LIMIT)
        {
            关系=新的关系();
            relation.setBook_id(新的整数(c.getString(0))的intValue());

            串[] name_splitted = c.getString(1).split();
            relation.setFirstName(name_splitted [0]);
            如果(name_splitted.length→1)relation.setLastName(name_splitted [1]);

            ArrayList的<字符串>号码= getPhoneNumbers(c.getString(0));
            relation.setNumber(numbers.size()大于0 numbers.get(0):);

            relation.setConcept(任何);
            relation.setPhoto(loadContactPhoto(三)== NULLandroid.resource://com.orange.rd.kramer/drawable/default_photo:loadContactPhoto(C));

            cList.add(关系);
            A ++;
        }
        c.close();
        返回CLIST;
    }

    / **
     *返回一个URI指向联系人的照片
     *
     * @version 1.0
     * @Since 2012-03-28
     *在一个特定的联系人@param光标光标
     * @返回返回一个URI指向联系人的照片
    * /
    私人字符串loadContactPhoto(光标指针)
    {
        如果(cursor.getString(5)!= NULL)
        {
            乌里contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,cursor.getInt(0));
            返回Uri.withAppendedPath(contactUri,ContactsContract.Contacts.Photo.CONTENT_DIRECTORY)的ToString();
        }
        返回null;
    }

    / **
     *返回属于给定的接触的所有电话号码的列表
     *
     * @version 1.0
     * @Since 2012-03-28
     *给定的接触@参数的ID
     * @返回返回属于给定的接触的所有电话号码的列表
    * /
    私人的ArrayList<字符串> getPhoneNumbers(字符串ID)
    {
        ArrayList的<字符串>手机=新的ArrayList<字符串>();

        光标pCur = context.getContentResolver()查询(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,空,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +=?,新的String [] {ID},空)。
        而(pCur.moveToNext())
        {
            phones.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
        }
        pCur.close();
        返回(电话);
    }

    / **
     *插入给定关系到股票电话簿
     *
     * @version 1.0
     * @Since 2012-03-28
     * @参数 -  [R关系加入到股票电话簿
    * /
    公共无效插入(关系R)
    {
        ArrayList的< ContentProviderOperation> OPS =新的ArrayList< ContentProviderOperation>();
        INT rawContactInsertIndex = ops.size();

        建设者建设者= ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI);
        builder.withValue(RawContacts.ACCOUNT_TYPE,NULL);
        builder.withValue(RawContacts.ACCOUNT_NAME,NULL);
        ops.add(builder.build());

        // 名称
        建设者= 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()代替(, - )++ r.getLastName()代替(, - ));
        ops.add(builder.build());

        // 数
        建设者= 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());

        // 图片
        尝试
        {
            位图的位图= MediaStore.Images.Media.getBitmap(context.getContentResolver(),Uri.parse(r.getPhoto()));
            ByteArrayOutputStream形象=新ByteArrayOutputStream();
            bitmap.com preSS(Bitmap.Com pressFormat.JPEG,100,图像);
            建设者= 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());
        }
        赶上(例外五)
        {
            e.printStackTrace();
        }

        //添加新联系人
        尝试
        {
            。context.getContentResolver()applyBatch(ContactsContract.AUTHORITY,OPS);
        }
        赶上(例外五)
        {
            e.printStackTrace();
        }

        串选择=(+ ContactsContract.Contacts.DISPLAY_NAME +== \+ r.getFirstName()代替(, - )++ r.getLastName()代替(,  - )+\);
        光标C = context.getContentResolver()查询(ContactsContract.Contacts.CONTENT_URI,CONTACTS_SUMMARY_PROJECTION,选择,空,ContactsContract.Contacts.DISPLAY_NAME +分页中局部ASC)。
        context.startManagingCursor(C);

        如果(c.moveToNext())
        {
            r.setBook_id(新的整数(c.getString(0))的intValue());
        }
        其他
        {
            r.setBook_id(-1);
        }
    }

    / **
     *更新股票电话簿给定的关系
     *
     * @version 1.0
     * @Since 2012-03-28
     * @参数 -  [R关系在股票电话簿更新
    * /
    公共无效更新(关系R)
    {
        Log.e(,+ r.getBook_id());
        ArrayList的< ContentProviderOperation> OPS =新的ArrayList< ContentProviderOperation>();

        建设者建设者= ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI);
        builder.withValue(RawContacts.ACCOUNT_TYPE,NULL);
        builder.withValue(RawContacts.ACCOUNT_NAME,NULL);
        ops.add(builder.build());

        // 名称
        建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
        builder.withSelection(ContactsContract.Data._ID,新的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());

        // 数
        建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
        builder.withSelection(ContactsContract.Data._ID,新的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());

        // 图片
        尝试
        {
            位图的位图= MediaStore.Images.Media.getBitmap(context.getContentResolver(),Uri.parse(r.getPhoto()));
            ByteArrayOutputStream形象=新ByteArrayOutputStream();
            bitmap.com preSS(Bitmap.Com pressFormat.JPEG,100,图像);
            建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
            builder.withSelection(ContactsContract.Data._ID,新的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());
        }
        赶上(例外五)
        {
            e.printStackTrace();
        }

        //更新
        尝试
        {
            。context.getContentResolver()applyBatch(ContactsContract.AUTHORITY,OPS);
        }
        赶上(例外五)
        {
            e.printStackTrace();
        }
    }

    / **
     *删除从股票电话簿给定的关系
     *
     * @version 1.0
     * @Since 2012-03-28
     * @参数ř关系从库存电话簿除去
    * /
    公共无效删除(关系R)
    {
        光标pCur = context.getContentResolver()查询(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,空,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +=?,新的String [] {+ r.getBook_id()},空);
        而(pCur.moveToNext())
        {
            串lookupKey = pCur.getString(pCur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            开放的我们的uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI,lookupKey);
            。context.getContentResolver()删除(URI,NULL,NULL);
        }
    }
}
 

解决方案

最后,我发现了如何更新联系人,这里是更新方法的code:

 公共无效更新()
    {
        INT ID = 1;
        字符串名字=联系人的名字;
        字符串姓氏=姓;
        串号=000 000 000;
        字符串photo_uri =android.resource://com.my.package/drawable/default_photo;

        ArrayList的< ContentProviderOperation> OPS =新的ArrayList< ContentProviderOperation>();

        // 名称
        建设者建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
        builder.withSelection(ContactsContract.Data.CONTACT_ID +=+和+ ContactsContract.Data.MIMETYPE +=?,新的String [] {将String.valueOf(ID),ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE} );
        builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,姓氏);
        builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,名字);
        ops.add(builder.build());

        // 数
        建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
        builder.withSelection(ContactsContract.Data.CONTACT_ID +=?+和+ ContactsContract.Data.MIMETYPE +=?+和+ ContactsContract.CommonDataKinds.Organization.TYPE +=?,新的String [ ] {将String.valueOf(ID),ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,将String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_HOME)});
        builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,数量);
        ops.add(builder.build());


        // 图片
        尝试
        {
            点阵位图= MediaStore.Images.Media.getBitmap(getContentResolver(),Uri.parse(photo_uri));
            ByteArrayOutputStream形象=新ByteArrayOutputStream();
            bitmap.com preSS(Bitmap.Com pressFormat.JPEG,100,图像);

            建设者= ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
            builder.withSelection(ContactsContract.Data.CONTACT_ID +=+和+ ContactsContract.Data.MIMETYPE +=?,新的String [] {将String.valueOf(ID),ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE} );
            builder.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO,image.toByteArray());
            ops.add(builder.build());
        }
        赶上(例外五)
        {
            e.printStackTrace();
        }

        //更新
        尝试
        {
            。getContentResolver()applyBatch(ContactsContract.AUTHORITY,OPS);
        }
        赶上(例外五)
        {
            e.printStackTrace();
        }
    }
 

字段 ID 是原始接触式ID返回,当你插入一个新的联系人到数据库中。这里是code得到这个ID:

  ContentProviderResult []资源;
    尝试
    {
        RES = KramerApplication.getInstance()getContentResolver()applyBatch(ContactsContract.AUTHORITY,OPS)。
        如果(RES = NULL和放大器;!&安培;!RES [0] = NULL)
        {
            。串的uri =水库[0] .uri.getPath()子(14);
            r.setBook_id(新整型(URI).intValue());
        }
    }
    赶上(例外五)
    {
        e.printStackTrace();
    }
 

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

I'm trying to update a contact of my phone book directly from my app. I'm able to add and delete the contacts but the update just does nothing!

After the insert or when I grab the contacts, I collect the CONTACT_ID (Aka _ID).

Here is my code for the 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() gives me the _ID value of the current contact. r.getFirstName() and r.getLastName() give me the name of the contact. r.getPhoto() gives me his photo uri. And finally r.getNumber() gives me his phone number.

The Log line gives me a correct value of _ID, I don't think the problem comes from here. Did I do something wrong?

Thanks.

Regards.

V.


Whole source code:

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

解决方案

Finally, I found how to update a contact, here is the code of the update method:

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

The field id is the raw contact id returned when you insert a new contact into the database. Here is the code to get this 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();
    }

Check my first question if you want to know more about how to insert/delete a contact.

这篇关于Android的 - 更新联系人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆