如何将 Base64 字符串转换为 Android 上的位图?

How to convert a Base64 string to Bitmap on Android?

我在 android 应用程序中将几个 Base64 字符串转换为位图图像时遇到了这个问题。 现在我已经寻找了很长一段时间的解决方案,但似乎没有什么能解决我的问题。 我的应用程序从服务器获取 JSON 数据,其中包含多张 base64 格式的图像。从服务器收到的 json 代码可以在这里找到:http://pastebin.com/tgiMgqRg 我试着解码这个网站上的第一张图片:http://www.opinionatedgeek.com/dotnet/tools/base64decode/,它似乎是正确的。

接收 JSON 日期的代码是:

    public JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {

    // Making HTTP request
    try {
        HttpClient httpClient = sslClient(new DefaultHttpClient());

        // check for request method
        if(method == "POST"){
            // request method is POST
            //DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }else if(method == "GET"){
            // request method is GET
            //DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);
            //DEBUG
            Log.d("JSONParser", "sent request : " + url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }           

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "UTF-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}

然后我尝试使用以下代码解码这些图像:

    try {
       images = json.getJSONArray(MapActivity.TAG_LIST);

            // looping through all Images
            for (int i = 0; i < images.length(); i++) {
                JSONObject house = images.getJSONObject(i);
                String photo = house.getString(TAG_PHOTO);
                //Log.d("PHOTO", photo);
                Log.d("PHOTO NUMBER", i + "");

                try {
                    byte[] decodedString = Base64.decode(photo, Base64.URL_SAFE);
                    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
                    HashMap<String, Bitmap> map = new HashMap<String, Bitmap>();
                    map.put(TAG_PHOTO, decodedByte);

                    imagesList.add(map);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

但我收到这些错误:

    D/PHOTO NUMBER(26854): 0
D/skia(26854): --- SkImageDecoder::Factory returned null
D/PHOTO NUMBER(26854): 1
D/skia(26854): --- SkImageDecoder::Factory returned null
D/PHOTO NUMBER(26854): 2
D/skia(26854): --- SkImageDecoder::Factory returned null
D/PHOTO NUMBER(26854): 3
W/System.err(26854): java.lang.IllegalArgumentException: bad base-64
W/System.err(26854):    at android.util.Base64.decode(Base64.java:161)
W/System.err(26854):    at android.util.Base64.decode(Base64.java:136)
W/System.err(26854):    at android.util.Base64.decode(Base64.java:118)
02W/System.err(26854):  at ...$LoadImages.doInBackground(DisplayHouseInfo.java:225)
W/System.err(26854):    at ...$LoadImages.doInBackground(DisplayHouseInfo.java:1)
W/System.err(26854):    at android.os.AsyncTask.call(AsyncTask.java:288)
W/System.err(26854):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err(26854):    at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
W/System.err(26854):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err(26854):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err(26854):    at java.lang.Thread.run(Thread.java:841)
D/PHOTO NUMBER(26854): 4
W/System.err(26854): java.lang.IllegalArgumentException: bad base-64
W/System.err(26854):    at android.util.Base64.decode(Base64.java:161)
                                            ...
D/PHOTO NUMBER(26854): 5
W/System.err(26854): java.lang.IllegalArgumentException: bad base-64
W/System.err(26854):    at android.util.Base64.decode(Base64.java:161)
                                            ...
D/PHOTO NUMBER(26854): 6
W/System.err(26854): java.lang.IllegalArgumentException: bad base-64
W/System.err(26854):    at android.util.Base64.decode(Base64.java:161)
                                            ...
02-27 14:57:11.316: E/BitmapFactory(26854): Unable to decode stream: java.io.FileNotFoundException: /: open failed: EISDIR (Is a directory)
I/System.out(26854): resolveUri failed on bad bitmap uri: 
E/BitmapFactory(26854): Unable to decode stream: java.io.FileNotFoundException: /: open failed: EISDIR (Is a directory)
I/System.out(26854): resolveUri failed on bad bitmap uri: 

我的问题是: - 我似乎无法让 BitmapFactory.decodeByteArray 工作 - 最后一张图片我得到了另一个例外

你有ideas/suggestions解决这个问题的方法吗?

表示图像的前三个base64字符串解码正常。但是以下四个在行

上产生了 bad base-64 的捕获
byte[] decodedString = Base64.decode(photo, Base64.URL_SAFE);

我之前说过。如果你会使用

byte[] decodedString = Base64.decode(photo, Base64.DEFAULT);

那么就没有捕获物了。所有 7 个 base64 字符串都可以解码。