我用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]"
}]
答案 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);
}