BitmapFactory.decodeStream restituisce sempre null e il decodificatore skia mostra la decodifica restituita falsa

immagini di prova qui: http://images.plurk.com/tn_4134189_bf54fe8e270ce41240d534b5133884ee.gif

Ho provato diverse soluzioni trovate su Internet ma non esiste una soluzione di lavoro.

  • Android come creare thumbnail di runtime
  • Visualizzazione di più stringhe su Logcat
  • NFC tag informazioni
  • Applicazione di widget di ricerca di Android Actionbar in ListFragment
  • takePicture non è rioutput quando si esegue un servizio camera
  • Quale vista dovrebbe essere usata per la nuova navigazione inferiore del materiale di progettazione?
  • Sto usando il seguente codice di snippet:

    Url imageUrl = new Url("http://images.plurk.com/tn_4134189_bf54fe8e270ce41240d534b5133884ee.gif"); Bitmap image = BitmapFactory.decodeStream(imageUrl.openStream()); 

    Sempre questo log:

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

    Qualsiasi aiuto? Grazie.

    EDIT:

    Queste immagini non sono state decodificate, inoltre non possono essere visualizzate in un WebView . Ma può vedere se aperto in un browser.

  • Dove registrare un BroadcastReceiver (divertimento del ciclo di vita di attività)
  • android si connette a magento
  • Android 4.4 hce (emulazione di tabs basate su host) lunghezza "processCommandApdu" apdu
  • Impostare la width per soddisfare i vincoli in ConstraintLayout
  • Aggiungere una visualizzazione di text ad un FrameLayout in una determinata posizione
  • Converti colorPrimary a colorPrimaryDark (quanto più scuro)
  • 9 Solutions collect form web for “BitmapFactory.decodeStream restituisce sempre null e il decodificatore skia mostra la decodifica restituita falsa”

    Prova questo come una soluzione temporanea:

    Aggiungere la seguente class:

      public static class PlurkInputStream extends FilterInputStream { protected PlurkInputStream(InputStream in) { super(in); } @Override public int read(byte[] buffer, int offset, int count) throws IOException { int ret = super.read(buffer, offset, count); for ( int i = 2; i < buffer.length; i++ ) { if ( buffer[i - 2] == 0x2c && buffer[i - 1] == 0x05 && buffer[i] == 0 ) { buffer[i - 1] = 0; } } return ret; } } 

    Poi avvolgi il tuo stream originale con PlurkInputStream:

     Bitmap bitmap = BitmapFactory.decodeStream(new PlurkInputStream(originalInputStream)); 

    Fammi sapere se questo ti aiuta.

    EDIT:

    Spiacenti, prova invece alla versione seguente:

      for ( int i = 6; i < buffer.length - 4; i++ ) { if ( buffer[i] == 0x2c ) { if ( buffer[i + 2] == 0 && buffer[i + 1] > 0 && buffer[i + 1] <= 48 ) { buffer[i + 1] = 0; } if ( buffer[i + 4] == 0 && buffer[i + 3] > 0 && buffer[i + 3] <= 48 ) { buffer[i + 3] = 0; } } } 

    Si noti che questo non è un codice efficiente né è una soluzione completa / corretta. Funzionerà per la maggior parte dei casi, ma non tutti.

    Ho avuto lo stesso problema, in parte è stato fissato da questa class:

     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 byte = read(); if (byte < 0) { break; // we reached EOF } else { bytesSkipped = 1; // we read one byte } } totalBytesSkipped += bytesSkipped; } return totalBytesSkipped; } 

    }

    E:

     InputStream in = null; try { in = new java.net.URL(imageUrl).openStream(); } catch (MalformsdURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Bitmap image = BitmapFactory.decodeStream(new FlushedInputStream(in)); 

    Ha aiutato nella maggior parte dei casi, ma questa non è una soluzione universale. Per ulteriori informazioni, fare riferimento a questo bugreport .

    Buona fortuna!

    Ho provato tutte le soluzioni, ma non ho risolto il mio problema. Dopo alcuni test, il problema del fallimento del decoder skia è accaduto molto quando la connessione a Internet non è stabile. Per me, forzando per riprovare l'image risolto il problema.

    Il problema si è presentato anche quando l'image è di grandi size.

    Utilizzando un ciclo mi richiederà al massimo 2 tentativi e l'image verrà scaricata correttamente.

     Bitmap bmp = null; int retries = 0; while(bmp == null){ if (retries == 2){ break; } bmp = GetBmpFromURL(String imageURL); Log.d(TAG,"Retry..."); retries++; } 

    Questo dovrebbe funzionare:

     URL url = new URL(src); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); connection.disconnect(); input.close(); 

    myBitmap contiene la tua image.

    questo è dovuto ad un errore nella class InputStream in Android. È ansible trovare una soluzione alternativa valida e una descrizione del bug qui http://code.google.com/p/android/issues/detail?id=6066

    Per motivi di memory, è necessario implementare le opzioni BitmapFactory come questo:

     BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; // might try 8 also 

    La function di bitmap di download principale forse come questo:

     Bitmap downloadBitmap(String url) { final HttpClient client = AndroidHttpClient.newInstance("Android"); final HttpGet getRequest = new HttpGet(url); try { HttpResponse response = client.execute(getRequest); final int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_OK) { if(DEBUG)Log.w("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url); return null; } final HttpEntity entity = response.getEntity(); if (entity != null) { InputStream inputStream = null; try { inputStream = entity.getContent(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; // might try 8 also return BitmapFactory.decodeStream(new FlushedInputStream(inputStream),null,options); } finally { if (inputStream != null) { inputStream.close(); } entity.consumeContent(); } } } catch (IOException e) { getRequest.abort(); if(DEBUG)Log.w(TAG, "I/O error while retrieving bitmap from " + url, e); } catch (IllegalStateException e) { getRequest.abort(); if(DEBUG)Log.w(TAG, "Incorrect URL: " + url); } catch (Exception e) { getRequest.abort(); if(DEBUG)Log.w(TAG, "Error while retrieving bitmap from " + url, e); } finally { if ((client instanceof AndroidHttpClient)) { ((AndroidHttpClient) client).close(); } } return null; } 

    E forse è necessario implementare AsyncTask come questo: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

    Per me il problema è con il tipo di colore dell'image: la tua image è in colore = CYMK non in RGB

    Forse questo non è il tuo caso, ma potrebbe essere se si sta tentando di decodificare le immagini con lo spazio dei colors CMYK, anziché spazio colors RGB. Le immagini CMYK, come questa , non sono supportte da Android e non verranno visualizzate neppure nel browser web Android. Per saperne di più qui :

    Imansible caricare l'image JPEG con BitmapFactory.decodeFile. Restituisce null

    Prova questo:

     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); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.