2015-07-28 2 views
0

Я пытаюсь получить простой рабочий стол decodeFile, и я теряю сознание.BitmapFactory.decodeFile возвращает null с надлежащим файлом

Ниже код возвращает null в то время как LogCat говорит: D/skia﹕ --- decoder->decode returned false Aldo иногда удается работать (один из MBY 50 раз).

try { 
     BitmapFactory.Options opt = new BitmapFactory.Options(); 
     opt.inDither = true; 
     opt.inPreferredConfig = Bitmap.Config.ARGB_8888; 

     canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath(), opt); 

    } catch (OutOfMemoryError e) { 
     Log.d(TAG, "Trace: " + e); 

     System.gc(); 

     try { 
      Log.d(TAG, "Trying again"); 
      canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath()); 
     } catch (OutOfMemoryError e2) { 
      Log.d(TAG, "Trace: " + e2); 
      Log.d(TAG, "Out of memory!!!!!!!"); 
     } 
    } 

Файл определяется и getAbsolutePath возвращает /storage/emulated/0/Pictures/Screenshots/Screenshot_2015-07-28-16-18-56.png

Файл основном скриншот взят на телефон, он может быть открыт только штраф на галерею приложений и ПК, так что это не поврежден.

Если по какой-то причине это просто не будет работать, есть ли какие-либо пользовательские библиотеки с их собственными декодерами? Я пробовал пару библиотек, но все они, похоже, используют один и тот же decodeFile.

Я тестирую на nexus 4, поэтому изображение 760p.

+0

В этом коде ничего не вернулось. Что тогда было бы ложным? – greenapps

+0

'Log.d (TAG," Trace: "+ e);'. Это даже не компилируется. – greenapps

+0

@greenapps Ему нужно установить растровое изображение из файла, тэг журнала компилируется на моей стороне, проверьте импорт. – Domiq

ответ

0

Я решил эту проблему, добавив while петлю с if else

следующий код:

BitmapFactory.Options opt = new BitmapFactory.Options(); 
      opt.inDither = true; 
      opt.inPreferredConfig = Bitmap.Config.ARGB_8888; 

      int i = 0; 
      while (canvasBitmap == null && ++i < 99) { 

       System.gc(); 

       Log.d(TAG, "Trying again: " + i); 
       canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath(), opt); 
      } 

Это кажется довольно неэффективно, но работает, я также запустить его вне основной нить, чтобы он не вызывал никакого реагирующего поведения.

+1

В чем была ваша проблема? Этот код не имеет для меня никакого смысла. Для одного файла вы будете называть decodeFile() до 40 раз в надежде, что он это сделает? Вы должны просто остановиться, как только он вернет null; – greenapps

+1

'while (canvasBitmap == null && ++ i <40)'. – greenapps

0

Повторная попытка decodeFile() не имеет смысла. Потому что decodeFile() вернет значение null, если для создания битмапа недостаточно памяти. Вы не получите никакого другого предупреждения, тогда возвращаемое значение null. Поэтому просто проверьте значение null; -

+0

Хорошо, поэтому я как-то решил это, сделав цикл while, если еще проверит растровое изображение. И я пропустил цикл while в 50 раз перед сбоем. Но должен быть лучший способ, не так ли?В конце приложение занимает 15 МБ, и я не могу поставить под угрозу качество из-за целей приложений. И он может по-прежнему терпеть неудачу, даже с 50 попытками. – Domiq

+1

Вы добавили a.'canvasBitmap.recycle(); 'после использования; '15mb'? Вы имеете в виду 15 МБ? – greenapps

+0

да 15 МБ, я добавлю утилиту после того, как код будет выполнен действительно, но я все еще немного боюсь старой совместимости с устройством. У старых устройств Aldo также меньше разрешение, следовательно, меньшие изображения. – Domiq

Смежные вопросы