Проверьте, поддерживает ли устройство формат изображений webP

Есть ли способ проверить, поддерживает ли устройство формат изображения (в частности, формат webP). Согласно документу Android (http://developer.android.com/guide/appendix/media-formats.html), webP поддерживается на устройствах 4.0+. введите описание изображения здесь

Но некоторые из устройств 4.0+ еще не поддерживают webP. (например, Noxia XL- http://developer.nokia.com/community/wiki/Nokia_X_known_issues). Есть ли способ программно проверить, поддерживает ли устройство изображение webP или нет. Любая помощь будет принята с благодарностью. Спасибо!


person Abhishek V    schedule 28.01.2015    source источник
comment
поместите небольшой (1x1) webp в активы и попытайтесь его декодировать ... если результат равен нулю или метод выдает исключение, webp не поддерживается   -  person Selvin    schedule 28.01.2015
comment
@Selvin Спасибо, я попробую. Но есть ли простой способ добиться этого? Я имею в виду, предоставляет ли Android какие-либо встроенные функции / API для проверки совместимости с мультимедиа?   -  person Abhishek V    schedule 28.01.2015
comment
Но есть ли простой способ добиться этого? Я не знаю такой способ ... попробуйте: gist.github.com/SelvinPL/d94b2b617519e0510a40   -  person Selvin    schedule 28.01.2015
comment
Работает. Спасибо!. Можете ли вы опубликовать свой комментарий в качестве ответа, чтобы я мог принять ответ.   -  person Abhishek V    schedule 28.01.2015
comment
хорошо, я сделал это ... лучше использовать новую версию ... я забыл переработать растровое изображение ... также Base64 поддерживается в API ›7 ... эта версия должна работать на всех Android ... и я нашел меньший 1x1 изображение webp :)   -  person Selvin    schedule 29.01.2015


Ответы (1)


Насколько я знаю, для этого нет API. Поэтому решение состоит в том, чтобы попытаться декодировать какое-то изображение webp на устройстве и проверить, возвращает ли оно Bitmap.

Это можно реализовать так:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class WebPUtils {
    //states
    private static final int NOT_INITIALIZED = -1;
    private static final int SUPPORTED = 1;
    private static final int NOT_SUPPORTED = 0;

    //why not boolean? we need more states for result caching
    private static int isWebPSupportedCache = NOT_INITIALIZED;

    public static boolean isWebPSupported() {
        // did we already try to check?
        if (isWebPSupportedCache == NOT_INITIALIZED) {
            //no - trying to decode
            //webp 1x1 transparent pixel with lossless
            final byte[] webp1x1 = new byte[]{
                    0x52, 0x49, 0x46, 0x46, 0x1A, 0x00, 0x00, 0x00,
                    0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38, 0x4C,
                    0x0D, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00,
                    0x10, 0x07, 0x10, 0x11, 0x11, (byte) 0x88, (byte) 0x88, (byte) 0xFE,
                    0x07, 0x00
            };
            try {
                final Bitmap bitmap = BitmapFactory.decodeByteArray(webp1x1, 0, webp1x1.length);
                if (bitmap != null) {
                    //webp supported
                    isWebPSupportedCache = SUPPORTED;
                    //don't forget to recycle!
                    bitmap.recycle();
                } else {
                    //bitmap is null = not supported
                    isWebPSupportedCache = NOT_SUPPORTED;
                }
            } catch (Exception ex) {
                //we got some exception = not supported
                isWebPSupportedCache = NOT_SUPPORTED;
                ex.printStackTrace();
            }
        }
        return isWebPSupportedCache == SUPPORTED;
    }
}
person Selvin    schedule 29.01.2015