Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-更新联系人_Java_Android - Fatal编程技术网

Java Android-更新联系人

Java Android-更新联系人,java,android,Java,Android,我正在尝试直接从我的应用程序更新电话簿的联系人。我可以添加和删除联系人,但更新什么也不做 插入后或抓取联系人时,我收集联系人ID(又名ID) 以下是我的更新代码: public void update(Relation r) { Log.e("", ""+r.getBook_id()); ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

我正在尝试直接从我的应用程序更新电话簿的联系人。我可以添加和删除联系人,但更新什么也不做

插入后或抓取联系人时,我收集联系人ID(又名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();
    }
}

要更新联系人,您需要同时具有联系人id和联系人id。。。因此,在更新时,将其作为值添加到where子句/选择参数中

像这样的

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());
ArrayList ops=new ArrayList();
//------------------------------------------------------名字
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带值(contacts contract.Data.RAW\u CONTACT\u ID,RAW contactid)
.带值(contacts contract.Data.MIMETYPE,
ContactsContract.CommonDataTypes.StructuredName.CONTENT\u ITEM\u TYPE)
.withValue(ContactsContract.CommonDataTypes.StructuredName.PREFIX,data.getTitle())
.withValue(ContactsContract.CommonDataTypes.StructuredName.后缀,data.getSuffix())
.withValue(ContactsContract.CommonDataTypes.StructuredName.GIVEN_NAME,data.getFirstName())
.withValue(ContactsContract.CommonDataTypes.StructuredName.MIDDLE\u名称,data.getMiddleName())
.withValue(ContactsContract.CommonDataTypes.StructuredName.FAMILY_NAME,data.getSuffix())
.withValue(ContactsContract.CommonDataTypes.StructuredName.DISPLAY_NAME,data.getFirstName()+“”+data.getMiddleName()).build());

我不确定这是否对您有帮助,但是我发现了一个关于联系人id和原始联系人id之间区别的博客:

在本博客中,他很好地解释了contacts api的工作原理,如果我理解正确,您必须使用原始联系人id来更改您的条目。因此,请忘记更新的联系人id,并更改您的更新,以便更改原始联系人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);

我希望这对您有所帮助,再次感谢您之前的帮助表单。

最后,我找到了如何更新联系人,以下是更新方法的代码:

    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。然后我用你的修改了我的SC。但是什么也没发生……我唯一想到的是,可能使用ops.add(ContentProviderOperation.newUpdate(RawContacts.CONTENT_URI)而不是ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)。这可能解决了问题。以下代码更新了联系人的姓名以及他的电话号码:s
Builder Builder=ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);Builder.with selection(ContactsContract.commonDataTypes.StructuredName.contact_ID+“=?”,新字符串[]{String.valueOf(r.getBook_ID())});builder.withValue(ContactsContract.CommonDataTypes.StructuredName.DISPLAY_NAME,r.getFirstName().replace(“,“-”)+”+r.getLastName().replace(“,”-”);ops.add(builder.build())
感谢您发布正确答案。当您使用raw联系人更新时,联系人id是否会更改或保持不变?您是否可以使用以前没有的信息更新raw联系人?我的意思是,您是否可以使用图像更新raw联系人,即使它只有一次插入?没问题。是的,请使用raw联系人id和contact_id保持不变。当您将id存储到数据库中时,这会更容易。是的,您可以更新以前未填充的字段。感谢您的代码。您的图像代码几乎正常工作。但问题是编辑图像后,它只在detailview图片(本机联系人)中更新图像,而不在listview图片(本机联系人)中更新图像谢谢。花了一整天的时间,你的代码救了我。(Y)在我的情况下,这个解决方案不起作用,我不得不将
contacts contract.Data.CONTACT\u ID
更改为
contacts contract.Data.RAW\u CONTACT\u ID
,并提供
RAW\u ID
    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();
        }
    }
    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();
    }