如何查找支持联系人头像的最大图像尺寸?

7

背景

从果冻豆(4.1)开始,Android现在支持分辨率为720x720的联系人图片。

在此之前,从ICS(4.0)开始,Android就支持分辨率为256x256的联系人图片。

而在此之前,联系人照片只有一个缩略图大小 - 96x96。

问题

API中是否有返回联系人图片最大尺寸的函数?

我也希望制造商没有更改最大图像大小,即使他们确实更改了,我们也有这样的功能,并且可以返回正确的大小。

2个回答

5
根据这个链接,获取最大尺寸的正确方式是:
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static int getMaxContactPhotoSize(final Context context) {
    if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
        // Note that this URI is safe to call on the UI thread.
        final Uri uri = ContactsContract.DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI;
        final String[] projection = new String[] { ContactsContract.DisplayPhoto.DISPLAY_MAX_DIM };
        final Cursor c = context.getContentResolver().query(uri, projection, null, null, null);
        try {
            c.moveToFirst();
            return c.getInt(0);
        } finally {
            c.close();
        }
    }
    // fallback: 96x96 is the max contact photo size for pre-ICS versions
    return 96;
}

编辑:如果我们使用至少API 16(4.1),可以使用类似以下内容的东西:

@AnyThread
@RequiresPermission(anyOf = [Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS])
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
fun getMaxContactPhotoSize(context: Context): Int {
    // Note that this URI is safe to call on the UI thread.
    if (contactMaxPhotoSize > 0)
        return contactMaxPhotoSize
    val uri = ContactsContract.DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI
    val projection = arrayOf(ContactsContract.DisplayPhoto.DISPLAY_MAX_DIM)
    context.contentResolver.query(uri, projection, null, null, null)?.use { cursor ->
        cursor.moveToFirst()
        contactMaxPhotoSize = cursor.getInt(0)
    }
    if (contactMaxPhotoSize > 0)
        return contactMaxPhotoSize
    // fallback: 720x720 is the max contact photo size for 4.1 version
    contactMaxPhotoSize = 720
    return contactMaxPhotoSize
}

@leRobot,你知道关于联系人缩略图的同样事情吗?意思是获取缩略图可以获得的最大尺寸?也许是一样的,但是使用“THUMBNAIL_MAX_DIM”代替? - android developer
1
这很奇怪,因为如果对于同一个联系人,您调用最后一个参数为布尔值的openContactPhotoInputStream方法,它应该始终返回高分辨率图片。我建议尝试获取PHOTO_ID和/或PHOTO_FILE_ID以手动查询Uri,因为open...方法可能在SDK之间存在问题。链接如下:http://developer.android.com/reference/android/provider/ContactsContract.ContactsColumns.html#PHOTO_ID - leRobot
@leRobot 确实很奇怪,因为今天发生了多次,现在我却无法再现。所以你是说可以使用PHOTO_ID和/或PHOTO_FILE_ID吗?你有推荐的示例吗? - android developer
1
我从未这样做过,但我在谷歌上搜索了一下(最终在SF上找到了答案,当然啦:D)。这个人似乎正在这样做。请查看他的queryContactImage方法,该方法从queryContactInfo中的PHOTO_ID获取数据。然后,他只需从查询中创建一个位图即可。请注意,您可以使用类似的方法来处理PHOTO_THUMBNAIL_URI。 - leRobot
1
哦,他还提到了一些API便利类,我曾经看过但直到现在才想起来。它提供了有关联系人照片如何存储在每个联系人的只读目录中以及如何获取系统存储的两张图片(缩略图和全分辨率)的示例见解:http://developer.android.com/reference/android/provider/ContactsContract.Contacts.Photo.html - leRobot
显示剩余6条评论

2

来自公告:

使用Android 4.1,您可以存储大小为720 x 720的联系人照片,使联系人更加丰富和个性化。应用程序可以以该大小存储和检索联系人照片,或者使用任何其他所需的大小。 特定设备支持的最大照片尺寸可能会有所不同,因此应用程序应在运行时查询内置联系人提供程序以获取当前设备的最大尺寸。

我会查询ContactsContract.DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI。它应该返回您要查找的内容。


如果我说错了,请纠正我,但如果您的API版本低于14,那么它将是96x96,而且您不需要查询,对吗? - Geobits
我听说一些制造商即使在Gingerbread上也使用了更高的分辨率来进行联系人管理。但我不确定这个信息来源于哪里,可能是错误的。 - android developer
即便如此,你仍需要了解每个制造商的自定义查询,因为在此之前没有标准化的查询。这可能会变成一个混乱的麻烦,我可能会避免这样做,并选择默认值供14岁以下的用户使用。 - Geobits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接