Intereting Posts
Изображение, не загружаемое с URL-адреса в пользовательскую инфо-окно с использованием библиотеки загрузки изображений Picasso в android Android WebView извлечение HTML Почему Android выделяет больше памяти, чем необходимо при загрузке изображений Как определить, что замедляет Android-приложение Данные Exif TAG_ORIENTATION всегда 0 Android SIP stack: NullPointerException в регистре Электронная почта с внутреннего хранилища Разрешить пользователю выбирать путь для сохранения файла на Android Com.android.dex.DexIndexOverflowException: идентификатор метода не в : 65536 в андроид-студии Разные с помощью Plugin vs appView.addJavascriptInterface Печать через Виртуальный принтер Google Android и горизонтальная шкала прокрутки TextView Тестирование обновления adb и установка? Android default textselector для копирования текста, не работающего Событие паузы Phonegap / Cordova, вызванное возобновлением для android; Не может отключить звук в результате

Android-декодер-> декодирование возвращено false для Bitmap download

Я начал получать

DEBUG/skia(xxxx): --- decoder->decode returned false 

Выдать несколько профилей из Facebook, которые я использую в ImageViews. Большинство работает отлично, но время от времени я обнаруживаю тот, который никогда не работает.

Я собираю свое приложение против Android 1.6 для обеспечения обратной совместимости.

Я сделал кое-какие операции и обнаружил несколько потоков в этом вопросе. Я уже использую FlushedInputStream, обсуждаемый здесь: http://code.google.com/p/android/issues/detail?id=6066

 Bitmap b = BitmapFactory.decodeStream(new FlushedInputStream(is)); imageView.setImageBitmap(b); 

Вот пример, который вызывает у меня проблемы: http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs269.snc3/23132_639284607_390_q.jpg

Может кто-нибудь проверить изображение и помочь мне выяснить, что вызывает проблемы?

В FlushedInputStream (есть) есть ошибка. Он терпит неудачу при медленных соединениях, но вы можете попробовать мой магический код, чтобы исправить это.

 Bitmap b = BitmapFactory.decodeStream(new FlushedInputStream(is)); imageView.setImageBitmap(b); 

Создать статический класс вне вашего метода

  static class FlushedInputStream extends FilterInputStream { public FlushedInputStream(InputStream inputStream) { super(inputStream); } @Override public long skip(long n) throws IOException { long totalBytesSkipped = 0L; while (totalBytesSkipped < n) { long bytesSkipped = in.skip(n - totalBytesSkipped); if (bytesSkipped == 0L) { int b = read(); if (b < 0) { break; // we reached EOF } else { bytesSkipped = 1; // we read one byte } } totalBytesSkipped += bytesSkipped; } return totalBytesSkipped; } } 

И вот вы идете .. теперь у вас не будет никаких проблем.

Вот способ, который работал для меня:

 HttpGet httpRequest = new HttpGet(url); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = (HttpResponse) httpclient .execute(httpRequest); HttpEntity entity = response.getEntity(); BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(entity); InputStream is = bufferedHttpEntity.getContent(); Drawable d = Drawable.createFromStream(is, ""); //or bitmap //Bitmap b = BitmapFactory.decodeStream(is); 

Исходный код этого ImageDownloader.java является хорошей ориентацией. В нем исправлено исправление ошибки, которое устраняет FlushedInputStream 6066 , предоставляя исправленный класс FlushedInputStream .

Еще одна вещь, которую вы, возможно, захотите позаботиться, – выполнить декодирование в том же потоке, что и HTTP-запрос:

 @Override protected Bitmap doInBackground(String... url) { // execute HTTP GET request and decode response ... return bitmap } @Override protected void onPostExecute(Bitmap result) { imageView.setImageBitmap(result); } 

Я выполнил декодирование в onPostExecute() , которое выполняется в потоке пользовательского интерфейса, и оно больше не работает, что дает мне ту же ошибку.

Вот способ, который работал для меня:

 public static Bitmap loadImageFromUrl(String url) { URL m; InputStream i = null; BufferedInputStream bis = null; ByteArrayOutputStream out =null; try { m = new URL(url); i = (InputStream) m.getContent(); bis = new BufferedInputStream(i,1024 * 8); out = new ByteArrayOutputStream(); int len=0; byte[] buffer = new byte[1024]; while((len = bis.read(buffer)) != -1){ out.write(buffer, 0, len); } out.close(); bis.close(); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } byte[] data = out.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); //Drawable d = Drawable.createFromStream(i, "src"); return bitmap; } 

Я загрузил изображение с помощью многопоточности, а затем мне пришлось зацикливать чтение inputStream, когда время потока было удержано другим. Убедитесь, что inputStream читается полностью.

Вот для меня проблема:

Из эмулятора я бы сохранил файл jpg локально (на эмулированной SD-карте), а затем попытался его прочитать и отобразить с помощью декодирования на эмуляторе, и он сработал. Затем, в качестве теста, я скопировал файл (используя adb pull) на мою машину разработки (xp), и отобразится с использованием «paint». Затем из эмулятора я загрузил файл (через http post) на мой сервер win2003. Используя «paint», он также отображается там. Но когда я загрузил его обратно в эмулятор (через http get), он не удался во время декодирования.

Затем я заметил, что файл, загруженный на сервер win2003, был на два байта меньше оригинала. Не совсем уверен, как это произошло, потому что я использовал одну и ту же логику загрузки в течение многих лет и никогда не замечал проблему раньше. В качестве теста я просто добавил еще два случайных байта во время загрузки, поэтому размер файла был точно таким же. Затем, при загрузке обратно в эмулятор, он декодируется и отображается правильно.

Так же, как проверка, я добавил два случайных байта на мои проекты xcode, а затем эти jpg-файлы также отображались на эмуляторе Android.

Итак, хотя файлы, которые были на два байта меньше отображались везде, они не были бы на эмуляторе. По-видимому, декодирование делает какой-то CRC, прежде чем он попытается декодировать и решает, что он не может продолжаться. И, следовательно, ошибка.

Другие, столкнувшиеся с проблемами в Android KitKat 4.4, будут полезны

 Bitmap b = BitmapFactory.decodeStream(new BufferedInputStream(is)); imageView.setImageBitmap(b); 

Я столкнулся с этой проблемой в серии Nexus. После обновления до 4.4.

Я столкнулся с этим вопросом, используя Xamarin. Чтобы исправить это, я просто использовал компонент Universal Image Loader Xamarin и работал как шарм.

Надеюсь это поможет!