Android 将Encode Base64到JSONObject的字符串结果从内存中取出
我读了很多关于OOM的问题,但我还是被卡住了。我根本无法使用jsonObject.toString获取数组字节。我有一张用相机拍摄的照片,我想把它发送到一家服务公司。我用HTTP POST发送,格式如下:Android 将Encode Base64到JSONObject的字符串结果从内存中取出,android,json,base64,out-of-memory,Android,Json,Base64,Out Of Memory,我读了很多关于OOM的问题,但我还是被卡住了。我根本无法使用jsonObject.toString获取数组字节。我有一张用相机拍摄的照片,我想把它发送到一家服务公司。我用HTTP POST发送,格式如下: { request : { image : encodedImageWithBase64 } } 但是我不能做一个JSONObject,因为它是OOM。下面是结果编码图像中的字符串示例: 下面是我的代码片段: JSONObject reques
{
request : {
image : encodedImageWithBase64
}
}
但是我不能做一个JSONObject,因为它是OOM。下面是结果编码图像中的字符串示例:
下面是我的代码片段:
JSONObject requestDict = new JSONObject();
try {
JSONArray tempRequestDic = new JSONArray();
JSONObject obj = new JSONObject();
obj.put("imagedata", strEncode64);
tempRequestDic.put(obj);
obj.put("image", tempRequestDic);
requestDict.put("request", obj); /* Here I get the Exception*/
// String strReqDict = String.valueOf(requestDict);
// File x = new File(String.valueOf(requestDict));
byte[] byteBitmapDecoded = requestDict.toString().getBytes(); /* Here my apps force stop cause OOM */
} catch (JSONException e) {
e.printStackTrace();
}
日志是:
抛出OutOfMemoryError无法分配301989896字节的分配,该分配包含16777216个可用字节和283MB
我需要此JSONObject中的一个字节[],但我无法构建JSONObject本身。尝试将android:hardwareAccelerated=false和android:largeHeap=true添加到清单中。因为OOM是处理位图时最常见的错误
<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme">
我以前试过这个,现在我再试一次,但我仍然无法将字符串放入JSONObject中。请尝试{JSONObject image=new JSONObject;JSONObject result=new JSONObject;image.putimage,encodedImageBase64;result.putresult,image;Log.dTAG,result:+result;}捕获JSONException e{Log.dTAG,JSONException:+e;}hi@Archana,抱歉响应太慢,largeHeap=true在其工作清单中显示,但仅在某些设备中显示。@MarioMargoPradipta上述代码将为您提供所需的JSON格式,我不知道您为什么要将整个JSON对象转换为字节。因为我需要在Volley上使用post方法体的字节。OOM仍然很少发生,但如果发生这种情况,应用程序将在用户设备上崩溃。不要对要发送到服务器的图像进行base64编码。不要使用json向服务器发送图像。@greenapps,但iOS也使用我的服务。有什么办法吗?
byte[] byteBitmapDecoded = Base64.decode(requestDict.toString, Base64.DEFAULT);