循环Bitmap类以将base64字符串转换为图像时出错

时间:2017-11-16 09:57:53

标签: java android json bitmap android-volley

我用Java编写了一个Web服务 - 我想要做的是在Android中读取JSON数据。问题是,在循环Bitmap类时,我收到错误 。我有随附的JSON请求代码:

RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest( Request.Method.GET, URL,null,
            new Response.Listener<JSONArray>() {

                @Override
                public void onResponse(JSONArray response) {

                    try{
                        // Loop through the array elements
                        for(int i=0;i<response.length();i++){

                            JSONObject jsonData = response.getJSONObject(i);

                            String name = jsonData.getString("name");
                            String manufacture = jsonData.getString("manufacture");
                            Double price = Double.valueOf(jsonData.getString("price"));
                            String imageString = jsonData.getString("image");

                            // Display the formatted json data in text view
                            productDetails.append("Name: " + name +"\nManufacture: " + manufacture + "\nPrice: " + price.toString() );
                            productDetails.append("\n\n");

                            // decode base64 string to image
                            decodeImageString( imageString, prodImageButton);

                        }
                    }catch (JSONException e){
                        Toast.makeText( getApplication(), e.getMessage().toString(), Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener(){
                @Override
                public void onErrorResponse(VolleyError error){
                    // Do something when error occurred
                    //Toast.makeText( getApplication(), error.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            });

    // Add JsonArrayRequest to the RequestQueue
    requestQueue.add(jsonArrayRequest);
}

private void decodeImageString(String imageString, ImageButton imageView){

    byte[] decodeString = Base64.decode (imageString, Base64.DEFAULT);
    Bitmap decoded = BitmapFactory.decodeByteArray (decodeString, 0, decodeString.length);
    imageView.setImageBitmap(decoded);
}

抛出的错误:

 E/AndroidRuntime: FATAL EXCEPTION: main
              Process: lagecy.live.desh.com.shoppincarttest, PID: 5224
              java.lang.IllegalArgumentException: bad base-64
                  at android.util.Base64.decode(Base64.java:161)
                  at android.util.Base64.decode(Base64.java:136)
                  at android.util.Base64.decode(Base64.java:118)
                  at lagecy.live.desh.com.shoppincarttest.MainActivity.decodeImageString(MainActivity.java:106)
                  at lagecy.live.desh.com.shoppincarttest.MainActivity.access$000(MainActivity.java:31)
                  at lagecy.live.desh.com.shoppincarttest.MainActivity$1.onResponse(MainActivity.java:84)
                  at lagecy.live.desh.com.shoppincarttest.MainActivity$1.onResponse(MainActivity.java:61)
                  at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
                  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6119)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

示例JSON数据:

[{
    "id": 1,
    "name": "Albany",
    "manufacture": "Albany Superior Low Gi Sliced Brown Seed Bread 700g",
    "price": 15.49,
    "category": "Food",
    "type": "Breads",
    "image": "data:image/jpeg;base64,...[long text string]"
}]

2 个答案:

答案 0 :(得分:0)

Base64.decode无法对其进行解码,因此必须从编码的字符串中删除它:

final String encodedString = "data:image/jpg;base64, ....";                        
final String pureBase64Encoded = encodedString.substring(encodedString.indexOf(",")  + 1);

现在可以解码pureBase64Encoded对象了:

 final byte[] decodeString= Base64.decode(pureBase64Encoded, Base64.DEFAULT);
Bitmap decoded = BitmapFactory.decodeByteArray (decodeString, 0, decodeString.length);
    imageView.setImageBitmap(decoded);

答案 1 :(得分:0)

  

更新的代码

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest( Request.Method.GET, URL,null,
            new Response.Listener<JSONArray>() {

                @Override
                public void onResponse(JSONArray response) {

                    try{
                        // Loop through the array elements
                        for(int i=0;i<response.length();i++) {

                            JSONObject jsonData = response.getJSONObject(i);

                            String name = jsonData.getString("name");
                            String manufacture = jsonData.getString("manufacture");
                            Double price = Double.valueOf(jsonData.getString("price"));
                            String imageString = jsonData.getString("image");


                            final String pureBase64Encoded = imageString.substring(imageString.indexOf(",") + 1);

                            // Display the formatted json data in text view
                            productDetails.append("Name: " + name + "\nManufacture: " + manufacture + "\nPrice: " + price.toString());
                            productDetails.append("\n\n");

                            productImages.add(i, pureBase64Encoded);

                            String prodImages = productImages.get(i).toString();


                            // decode base64 string to image
                            decodeImageString( prodImages, prodImageButton);


                        }

                    }catch (JSONException e){
                        Toast.makeText( getApplication(), e.getMessage().toString(), Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener(){
                @Override
                public void onErrorResponse(VolleyError error){
                    // Do something when error occurred
                    //Toast.makeText( getApplication(), error.getMessage().toString(), Toast.LENGTH_LONG).show();
                }
            });

    // Add JsonArrayRequest to the RequestQueue
    requestQueue.add(jsonArrayRequest);
}

private void decodeImageString(String imageString, ImageButton imageView){

    byte[] decodeString = Base64.decode (imageString, Base64.DEFAULT);
    Bitmap decoded = BitmapFactory.decodeByteArray (decodeString, 0, decodeString.length);
    imageView.setImageBitmap(decoded);

}