2016-06-28 32 views
5

Ho un server con diverse foto da 1,5 kb a 9 Mb. Le foto da PC, tablet e telefoni. Il server li codifica in stringhe Base64 e quindi li invia a un client Android. Una foto da 300 kb restituisce null quando decodifica in BitmapFactory.decodeByteArray ... Ma è un'immagine valida e buona decodificata nel decoder online. ?!Android BitmapFactory ritorno nullo sul Base64 decodificato array di byte

byte[] decodedString = Base64.decode(image64, Base64.DEFAULT); 
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, ecodedString.length); 

Per 2 giorni non riesco a trovare la risposta (

Tutte le idee Grazie

PS

private boolean decodeImage64(String uid, String image64, String name) { 
    Bitmap decodedByte; 
    boolean result = false; 
    if (image64 != null && !image64.isEmpty()) { 

     try { 
      Log.e(TAG, "decodeImage64: image64.getBytes().length = " + image64.getBytes().length); 
      byte[] decodedString = Base64.decode(image64, Base64.DEFAULT); 
      Log.e(TAG, "decodeImage64: decodedString = " + decodedString + " , decodedString.length = " + decodedString.length); 
      decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
      Log.e(TAG, "decodeImage64: decodedByte = " + decodedByte); 

      if (decodedByte != null) { 
       FileOutputStream out = null; 
       try { 
        out = new FileOutputStream(getImageFolderName() + "/" + uid + ".png"); 
        decodedByte.compress(Bitmap.CompressFormat.PNG, 100, out); 
        decodedByte.recycle(); 
        out.close(); 

       } catch (Exception e) { 
        Log.e(TAG, Log.getStackTraceString(e)); 
       } finally { 
        try { 
         if (out != null) { 
          out.close(); 
         } 
         if (decodedByte != null){ 
          decodedByte.recycle(); 
         } 
        } catch (IOException e) { 
         Log.e(TAG, Log.getStackTraceString(e)); 
        } 
       } 
       result = true; 
      }else { 
       Log.e(TAG, " !!!!!!!!!!!!!!!!!!!!!!! decodeImage64: decodedByte = null " + name); 
      } 
     }catch (Exception e){ 
      Log.e(TAG, Log.getStackTraceString(e)); 
     } 
    } else { 
     Log.e(TAG, "decodeImage64: image = null " + name); 
    } 
    return result; 
} 

E logcat

buona immagine:

06-29 02:33:57.465 18197-18584/cps.agrovisio E/myLogs: ------------------------- doInBackground: Good photo 
06-29 02:34:13.993 18197-18584/cps.agrovisio E/myLogs: decodeImage64: image64.getBytes().length = 2264744 
06-29 02:34:14.085 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedString = [[email protected] , decodedString.length = 1676499 
06-29 02:34:14.635 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedByte = [email protected] 

cattiva immagine:

06-29 02:33:56.041 18197-18584/сps.agrovisio E/myLogs: ------------------------- doInBackground: Bad photo 
06-29 02:33:57.177 18197-18584/cps.agrovisio E/myLogs: decodeImage64: image64.getBytes().length = 372570 
06-29 02:33:57.194 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedString = [[email protected] , decodedString.length = 275799 
06-29 02:33:57.245 18197-18584/cps.agrovisio E/myLogs: decodeImage64: decodedByte = null 
+0

cosa differenziano le immagini, tranne le loro dimensioni? – goto

+0

Mio amico puoi darci la tua immagine per provarlo? –

+0

Tutte le foto jpg. Problema da Tablet Android –

risposta

0

Questo non può essere la risposta che state cercando, ma avete pensato di utilizzare un quadro? Sono stato con Picasso ed è facile come: Picasso.with (contesto) .load ("http://i.imgur.com/DvpvklR.png") .into (ImageView);

http://square.github.io/picasso/

+0

Grazie! Ma non posso usare Picasso. Ho alcuni parametri in JSON, l'immagine in Base64 uno di questi –

0

fetta parte data:image/jpg;base64, da image64. Solo la stringa codificata.

È possibile utilizzare il metodo substring per questo, funzionerà.