更新地址簿后照片会自动缩放

时间:2011-06-22 14:27:19

标签: android

以下是我用来编写联系人PHOTO的代码。有用。如果我把它写到地址簿后又快又快又回去阅读联系方式,我会把照片还给我。

但是,在10秒左右之后,在调试器中你可以看到一个警报触发和一个线程启动,如果我再次读取相同的联系人就会消失,PHOTO从大约400x400缩小到96x96。

看起来后端有一个触发器触发,在写入后缩放PHOTO。有没有人知道绕过这个或控制它的方法?或者是否有更好的方法来编写不会导致缩放触发的PHOTO?

我在Droid的Android 2.1中这样做。

在试图确定我是否正确地写了PHOTO时,我看到有一个 ContactsContract.ContactsColumns接口与PHOTO_URI和PHOTO_THUMB_URI成员,但我找不到任何方法来获取它,因为接口受到保护,我找不到任何返回它们的连接。有人如何使用它们?

    Uri uri = ContactsContract.RawContacts.CONTENT_URI;
    String[] projection = new String[] { BaseColumns._ID };
    String selection = ContactsContract.RawContacts.CONTACT_ID + "=?";
    String[] arguments = new String[] { "" + lContactID };

    Cursor cursor = resolver.query(uri, projection, selection, arguments, null);
    if (cursor != null && cursor.getCount() > 0)
    {
        while (cursor.moveToNext())
        {
            long rawContactId = cursor.getLong(0);
            int row = -1;
            Uri uri = ContactsContract.Data.CONTENT_URI;
            String[] projection = new String[] { ContactsContract.Data._ID };
            String selection = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
            String[] params = new String[] { "" + rawContactId };

            Cursor cursor = resolver.query(uri, projection, selection, params, null);
            if (cursor != null && cursor.getCount() > 0)
            {
                if (cursor.moveToFirst())
                {
                    row = cursor.getInt(0);
                }
                cursor.close();
            }

            ContentValues values = new ContentValues();
            values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
            values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
            values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, pic);
            values.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);

            if (row >= 0)
            {
                resolver.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
            }
            else
            {
                resolver.insert(ContactsContract.Data.CONTENT_URI, values);
            }
        }
        cursor.close();
        cursor = null;
    }

1 个答案:

答案 0 :(得分:1)

事实证明,正是缩放照片的gmail.com同步适配器。

如果我关闭

设置 - >帐户& Syncs-> gmail.com->“同步通讯录”问题消失了。

为什么同步适配器需要在未放置的PHOTO上执行此操作?

如果这还不够,那与它的表现甚至不一致:

如果gmail.com联系人以前没有在服务器上有图片,当我将PHOTO写入地址簿时,它不会缩放。图片显示在服务器上。

但是,如果gmail.com联系人之前在服务器上有一张图片,当我将联系人写入地址簿时,我刚写的图片缩放为96x96。再一次,图片显示在服务器上。

因此,同步适配器有处理原始图片的错误,或者有更新图片的错误,因为它并不总是缩放照片。无论哪种方式,它都不应该缩放图片:(