【问题标题】:Android set contact photo good quality without pixilizationAndroid设置联系人照片质量好没有像素化
【发布时间】:2014-03-08 13:00:00
【问题描述】:

我正在开发应用程序来为来自社交网络的联系人提供和设置图片,并且我已经弄清楚如何将图片设置为联系人,但是当我以编程方式执行此操作时,图片的存储质量较低。 例如这里有 2 个例子,第一张图片是用我的应用设置的,第二张是用原生 android 联系人应用设置的(这两种情况的源图片完全相同):

第一个例子

使用我的应用程序:

使用原生应用:

第二个例子

使用我的应用程序:

使用原生应用:

你可以看到手和其他部位的像素化。

我用来设置联系人图片的代码:

public static boolean setContactPhoto(long contactId, byte[] photo) {
    ContentResolver cr = context.getContentResolver();
    ContentValues values = new ContentValues();
    long photoId = -1;
    long rawContactId = -1;
    Cursor rawContactsCursor = cr.query(
            ContactsContract.RawContacts.CONTENT_URI,
            new String[]{ContactsContract.RawContacts._ID},
            String.format("%s=%d", ContactsContract.RawContacts.CONTACT_ID, contactId),
            null,
            null
    );
    while (rawContactsCursor.moveToNext()) {
        rawContactId = rawContactsCursor.getLong(rawContactsCursor.getColumnIndex(ContactsContract.RawContacts._ID));
        String where = String.format(
                "%s=%d AND %s=='%s'",
                ContactsContract.Data.RAW_CONTACT_ID,
                rawContactId,
                ContactsContract.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
        );
        Cursor dataCursor = cr.query(
                ContactsContract.Data.CONTENT_URI,
                new String[]{ContactsContract.Data._ID},
                where,
                null,
                null
        );
        if (dataCursor.moveToFirst()) {
            photoId = dataCursor.getLong(dataCursor.getColumnIndex(ContactsContract.Data._ID));
            dataCursor.close();
            break;
        }
        dataCursor.close();
    }
    rawContactsCursor.close();

    if (rawContactId < 0) return false;

    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
    values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
    values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, photo);
    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);

    if (photoId < 0) {
        return cr.insert(ContactsContract.Data.CONTENT_URI, values) != null;
    } else {
        return cr.update(ContactsContract.Data.CONTENT_URI, values, String.format("%s=%d", ContactsContract.Data._ID, photoId), null) == 1;
    }
}

我的手机是 540x960 分辨率,所以源图片是 960x960,这很奇怪,但是如果我尝试设置 540x960 的图片,它会从四面八方裁剪并按比例放大,所以像素化更大。

那么,如何避免这种以编程方式设置联系人图片的像素化呢?

【问题讨论】:

  • 我们看不到图片......

标签: java android image photo contactscontract


【解决方案1】:

documentation 中所述,.photo 字段包含“原始联系人的缩略图”。

我认为您必须将 PHOTO_FILE_ID 设置为“通过照片文件 ID 访问全尺寸照片”。

查看相关ContactsContract.DisplayPhoto

【讨论】:

  • 对吗,我必须将位图数据写入临时目录并设置 PHOTO_FILE_ID 然后删除临时位图文件?可以给一些代码sn-p吗?
猜你喜欢
  • 2016-02-19
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多