内存不足将位图转换为字节数组时相机图像出错

时间:2017-02-10 06:12:05

标签: android

在经历了大量的内存分配错误解决方案之后,我暗示并尝试了很多这些用于我的应用程序,但我不知道为什么它仍然会给内存崩溃。它只发生在相机文件夹图像而不是其他人如果在某处出错,请帮我纠正我的代码。 首先是使用图像意图选择图像后的活动结果:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
            Uri filePath = data.getData();

            try {
                //getting image from gallery
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);

                //Setting image to ImageView
                ivImage.setImageBitmap(bitmap);
                Uri selectedImageUri = data.getData();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

另一种方法是通过将位图转换为字节数组来将图像上传到服务器的方法:

public void upload()
{
     progressDialog = new ProgressDialog(AddPropertyThird.this);
                progressDialog.setMessage("Uploading, please wait...");
                progressDialog.show();

                //converting image to base64 string
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = false;
                options.inPreferredConfig = Bitmap.Config.RGB_565;
                options.inDither = true;

              ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                byte[] imageBytes = stream.toByteArray();
                bitmap.recycle();

                final String imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);

                //sending image to server
                StringRequest request = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        progressDialog.dismiss();

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Log.e("volleyerror", "" + volleyError);
                    }
                }) {
                    //adding parameters to send
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> parameters = new HashMap<String, String>();
                        parameters.put("ImgStr", imageString);

                        return parameters;
                    }
                };

                RequestQueue rQueue = Volley.newRequestQueue(AddPropertyThird.this);
                rQueue.add(request);
            }

这是我的logcat错误:

 E/dalvikvm-heap: Out of memory on a 4192272-byte allocation.
Out of memory on a 4186240-byte allocation.
 Out of memory on a 2089032-byte allocation.
 FATAL EXCEPTION: main
                                                                    java.lang.OutOfMemoryError
                                                                      java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)

1 个答案:

答案 0 :(得分:0)

关于如何在避免内存不足错误的同时加载图像的第一个错误check out this question

您在使用ByteArray时出现Out of Memory错误,因为您正在将该图像从该行中的流中拉入内存

byte[] imageBytes = stream.toByteArray();

所以相反,你会想避免这样做。 Check out this answer