Search code examples
androidimagephotoresolutionandroid-contacts

How to find the max image size supported for contacts images?


background

starting with jelly bean (4.1), android now supports contact images that are 720x720 .

before, starting with ICS (4.0), android has supported contact images that are 256x256.

and before that, contact photos had just a size of a thumbnail - 96x96

the question

is there any function in the API that returns the max size of the contact image?

i also hope that the manufacturers didn't change the max image sizes, and even if they did and we have such a function, it would return us the correct size.


Solution

  • according to this link, the correct way to get the max size is:

    @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;
    }
    

    EDIT: if we use at least API 16 (4.1), it's possible to use something like:

    @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
    }