2016-06-28 2 views
5

У меня есть сервер с несколькими фотографиями от 1,5 кб до 9 Мб. Фотографии с ПК, планшеты и телефоны. Секрет закодирует их на строки Base64, а затем отправит их на клиент Android. Один 300 kb фото возвращает null при декодировании в BitmapFactory.decodeByteArray ... Но это действительное изображение и хорошее декодирование в онлайн-декодере. ?!Android BitmapFactory, возвращающий значение null на Base64 расшифрованный массив байтов

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

За 2 дня я не могу найти ответ (

Любые идеи Благодаря

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

И LogCat

хорошее изображение:

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] 

плохое изображение:

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

Какие отличия изображения, кроме их размера? – goto

+0

Моему другу вы можете дать нам свое изображение, чтобы попробовать? –

+0

Все фотографии jpg. Проблема с Android Tablet –

ответ

0

Это не может быть ответ, который вы ищете, но вы рассматривали использование рамки? Я использовал Picasso, и это так же просто: Picasso.with (context) .load ("http://i.imgur.com/DvpvklR.png") .into (imageView);

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

+0

Спасибо! Но я не могу использовать Пикассо. Я получил несколько параметров в json, образ в base64, один из них –

0

Нарезать часть data:image/jpg;base64, из image64. Только закодированная строка.

Для этого вы можете использовать метод подстроки, он будет работать.