2016-06-28 20 views
5

Ich habe einen Server mit mehreren Fotos von 1,5 kb bis 9 Mb. Die Fotos von PC, Tablets und Handys. Der Server verschlüsselt sie in Base64-Strings und sendet sie dann an einen Android-Client. Ein 300-kb-Foto gibt beim Dekodieren in BitmapFactory.decodeByteArray null aus. Aber es ist ein gültiges Bild und gut dekodiert im Online-Dekoder. ?!Android BitmapFactory gibt null auf Base64 decodierten Byte-Array

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

für 2 Tage, die ich keine Antwort finden kann (

Irgendwelche Ideen Dank

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; 
} 

Und logcat

gutes Bild:

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] 

schlechtes Bild:

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

was unterscheiden die Bilder, außer ihrer Größe? – goto

+0

Mein Freund kannst du uns dein Bild geben, um es zu versuchen? –

+0

Alle Fotos jpg. Problem von Android Tablet –

Antwort

0

Dies kann nicht die Antwort sein, die Sie suchen, aber haben Sie darüber nachgedacht, einen Rahmen mit? Ich benutze Picasso und es ist so einfach wie: Picasso.with (context) .load ("http://i.imgur.com/DvpvklR.png") .into (imageView);

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

+0

Danke! Aber ich kann Picasso nicht benutzen. Ich habe ein paar Parameter in JSON, Bild in Base64 eines von ihnen –

0

Scheibe der Teil data:image/jpg;base64, von image64. Nur die codierte Zeichenfolge haben.

Sie können Teilstring-Methode für diese verwenden, es wird funktionieren.