Android PNG в растровое изображение SkImageDecoder:: Factory вернуло значение null

Я пытаюсь загрузить скриншот из моего Environment.getExternalStorageDirectory() и попытаться преобразовать его в растровое изображение.

 public void onPictureTaken(String path) throws IOException {

    String photoPath = filepath + "/" + path;; //UPDATE WITH YOUR OWN JPG FILE

    File directory = new File (filepath);
    File file = new File(directory, path);

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(photoPath, options);

    // Calculate inSampleSize
    options.inSampleSize = 4;
    options.inJustDecodeBounds = false;
    BitmapFactory.decodeFile(photoPath, options);

}

--- SkImageDecoder::Factory вернул null

Вот моя функция, которая вызывает onPictureTaken:

 private void observeSceenshot(){
    filepath = Environment.getExternalStorageDirectory()
            + File.separator + Environment.DIRECTORY_PICTURES
            + File.separator + "Screenshots";
    Log.d(TAG, filepath);

    FileObserver fileObserver = new FileObserver(filepath, FileObserver.CREATE) {
        @Override
        public void onEvent(int event, String path) {
            Log.d(TAG, event + " " + path);
            try {
                onPictureTaken(path);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };

    fileObserver.startWatching();
}

Кто-нибудь знает, как решить проблему? Может быть, потому что мой png слишком большой (1280x720)? Я также попробовал это решение с тем же результатом: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Изменить: вот журнал

03-02 11:56:19.806 11581-11716/com.example.chilred_pc.myapplication D/DBG_com.example.chilred_pc.myapplication.ObserveСкриншоты: 256 Screenshot_2016-03-02-11-56-19.png 03-02 11: 56:19.806 11581-11716/com.example.chilred_pc.myapplication D/каталог: /storage/emulated/0/Pictures/Screenshots 03-02 11:56:19.806 11581-11716/com.example.chilred_pc.myapplication D/файл : /storage/emulated/0/Pictures/Screenshots/Screenshot_2016-03-01-16-38-08.png 03-02 11:56:19.806 11581-11716/com.example.chilred_pc.myapplication D/fileSize: 35061 03 -02 11:56:19.807 11581-11716/com.example.chilred_pc.myapplication D/skia: --- SkImageDecoder::Factory вернул null 03-02 11:56:19.808 11581-11716/com.example.chilred_pc.myapplication D/skia: --- decoder->decode вернул false


person Maddin    schedule 02.03.2016    source источник
comment
Убедитесь, что у вас есть разрешение для WRITE_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE в androidmanifest.xml. Пожалуйста, опубликуйте свой журнал ошибок.   -  person pRaNaY    schedule 02.03.2016
comment
что вы получаете, когда делаете int fileSize = file.length() ? каково значение fileSize   -  person Bhargav    schedule 02.03.2016
comment
Я уже написал это в androidmanifest.xml.   -  person Maddin    schedule 02.03.2016
comment
int fileSize = file.length() равно 0. Так что я действительно не знаю, почему? Если посмотреть в проводнике, то 0. На смартфоне 430 кб. Пробовал с другой картинкой тоже не работает   -  person Maddin    schedule 02.03.2016
comment
Виноват! С другим PNG(размер 430kb) работает.   -  person Maddin    schedule 02.03.2016
comment
Нет, в конце концов, это не работает   -  person Maddin    schedule 02.03.2016


Ответы (2)


Думаю, решение проблемы в том, что скриншоту нужно несколько секунд для создания изображения. Поэтому я попытался остановить систему на несколько секунд, и теперь она работает.

> SystemClock.sleep(3000);

Но в конце концов я использовал другой метод, который показан здесь: FileObserver Android

person Maddin    schedule 04.03.2016

Вместо заданного вручную значения options.inSampleSize = 4 рассчитайте InSampleSize, как показано ниже:

...
int reqWidth=100; // give your requested width
int reqHeight=100;// give your requested height
options.inSampleSize = calculateSampleSize(options,reqWidth,reqHeight);
...

public static int calculateSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {

    final int width = options.outWidth;
    final int height = options.outHeight;
    int inSampleSize = 1;

    if (width > reqWidth || height > reqHeight) {
        if (width > height) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        } else {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
    }
    return inSampleSize;
}

Рассчитайте InSampleSize, указанный в том же подобном, о котором вы говорите.

person pRaNaY    schedule 02.03.2016