【发布时间】:2017-10-12 06:07:14
【问题描述】:
我浏览了文档和多个相关帖子,但无法检测到我的代码中发生异常的位置和原因。我正在尝试单击图像,将其显示在 recyclerview 中(为此我将路径存储在 ArrayList 中)并上传它们。我有两个 ArrayList——一个用于在 recyclerView 中显示较小的位图,一个用于上传较大的位图。
这是捕获图像的代码:
public void captureImage(){
camera.setCameraListener(new CameraListener() {
@Override
public void onPictureTaken(byte[] picture) {
super.onPictureTaken(picture);
upload_bitmap= BitmapFactory.decodeByteArray(picture, 0, picture.length);
large_bitmap=getResizedBitmap(upload_bitmap,500);
result = BitmapFactory.decodeByteArray(picture, 0, picture.length);
bytes = new ByteArrayOutputStream();
result.compress(Bitmap.CompressFormat.JPEG, 25, bytes);
Bitmap newResult=getResizedBitmap(result,400,400);
String fileNameSmall = new SimpleDateFormat("yyyyMMddHHmmss'.txt'").format(new Date());
String fileNameLarge= new SimpleDateFormat("HHmmss'.txt'").format(new Date());
path = MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), newResult, fileNameSmall, null);
large_bitmap_path= MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), large_bitmap, fileNameLarge, null);
c = Calendar.getInstance();
df = new SimpleDateFormat("yyyy-MM-dd");
tf=new SimpleDateFormat("hh.mm.ss a");
formattedTime=tf.format(c.getTime());
formattedDate = df.format(c.getTime());
fileName="999999_".concat(formattedDate.toString()).concat(" at ").concat(formattedTime.toString()).concat(".jpg");
String uploadName=fileName;
Log.e("fileName",uploadName);
fileNameList.add(fileName);
horizontalList.add(path);
large_bitmapList.add(Uri.parse(large_bitmap_path));
i++;
iterator = horizontalList.iterator();
recycleViewAdapter.notifyDataSetChanged();
}
});
camera.captureImage();
}
这是上传图片的代码:
final ProgressDialog loading = ProgressDialog.show(this,"Uploading...","Please wait...",false,false);
StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
//Disimissing the progress dialog
loading.dismiss();
//Showing toast message of the response
Toast.makeText(CameraActivity.this, s , Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//Dismissing the progress dialog
loading.dismiss();
//Showing toast
Toast.makeText(CameraActivity.this, "error", Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
String img_path=image_path;
//Converting Bitmap to String
//Creating parameters
Map<String,String> parameters = new Hashtable<String, String>();
//Adding parameters
parameters.put("dateTime", "2017-10-09 01.43 PM");
parameters.put("type", "image");
parameters.put("fileName",fileNameList.get(j));
j++;
//returning parameters
return parameters;
}
};
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(stringRequest);
}
显然我不确定异常发生在哪里。有时工作,但有时,一旦我打开相机,它就会崩溃。 另外,存储两张不同大小的图像不是一个好主意,欢迎提出任何建议。 请尝试提供帮助而不是投反对票。谢谢。
Logcat
java.util.ConcurrentModificationException 在 java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:346) 在 java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:366) 在 android.hardware.Camera$Parameters.flatten(Camera.java:4243) 在 android.hardware.Camera.setParameters(Camera.java:3215) 在 com.flurgle.camerakit.Camera1.setFlash(Camera1.java:139) 在 com.flurgle.camerakit.Camera1.adjustCameraParameters(Camera1.java:376) 在 com.flurgle.camerakit.Camera1.openCamera(Camera1.java:317) 在 com.flurgle.camerakit.Camera1.start(Camera1.java:85) 在 com.flurgle.camerakit.CameraView$3.run(CameraView.java:216) 在 java.lang.Thread.run(Thread.java:818)
PS Camerakit 是我用来创建自定义适配器的库
【问题讨论】:
-
你能把错误日志也贴出来吗
-
是的。给我一分钟
-
看起来您的操作不是线程安全的。你是从不同的线程调用一个方法吗?还有
captureImage方法,你到底在哪里调用它。此外,您的代码对内存不友好。您正在创建太多位图。一种更好的方法是创建一个新活动并添加一个打开它的工厂。从新活动中捕获图像,然后仅将图像的 URI 推送到 recyclerview。 -
我正在从不同的方法调用一个方法。在 button.OnClickListener 上调用 captureImage。我知道代码对内存不友好。处理完异常后,我会尽快处理。
-
onClickListener方法写在哪里?在 recyclerview 适配器里面?