java 无法将图片从相机加载到ImageView

qv7cva1a  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(135)

在我的应用程序中,我想加载图片在imageview,我从相机或画廊。我的代码是:

private void selectImage() {
            onDestroy();
            this.onCreate(null);

            imageView.setImageResource(0);
            final CharSequence[] items = {"Take Photo", "Choose from Library",
                    "Cancel"};

            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("Add Photo!");
            builder.setIcon(R.mipmap.ic_launcher);
            builder.setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    if (items[item].equals("Take Photo")) {



                        intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                        File outputFile = getOutputMediaFile();
                        fileUri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider", outputFile);
                        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, fileUri);
                        startActivityForResult(intent, REQUEST_CAMERA);
                    } else if (items[item].equals("Choose from Library")) {
                        intent = new Intent();
                        intent.setType("image/jpg");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
                        startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_FILE);
                    } else if (items[item].equals("Cancel")) {
                        dialog.dismiss();
                    }
                }

            });
            builder.show();
        }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
            Log.e("onActivityResult", "requestCode " + requestCode + ", resultCode " + resultCode);

            //

            if (resultCode == Activity.RESULT_OK) {
                if (requestCode == REQUEST_CAMERA) {
                    try {

                        Log.e("CAMERA", fileUri.getPath());

                        bitmap = BitmapFactory.decodeFile(fileUri.getPath());
                        setToImageView(getResizedBitmap(bitmap, max_resolution_image));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (requestCode == SELECT_FILE && data != null && data.getData() != null) {
                    try {
                        // mengambil gambar dari Gallery
                        bitmap = MediaStore.Images.Media.getBitmap(MainActivity.this.getContentResolver(), data.getData());
                        setToImageView(getResizedBitmap(bitmap, max_resolution_image));
                    } catch (IOException e) {
                        e.printStackTrace();

                    }
                }
            }
        }

        // Untuk menampilkan bitmap pada ImageView
        private void setToImageView(Bitmap bmp) {

            //compress image
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.JPEG, bitmap_size, bytes);
            decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(bytes.toByteArray()));

            //menampilkan gambar yang dipilih dari camera/gallery ke ImageView
            imageView.setImageBitmap(decoded);
            Upload.setVisibility(View.VISIBLE);

        }

        // Untuk resize bitmap
        public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
            int width = image.getWidth();
            int height = image.getHeight();

            float bitmapRatio = (float) width / (float) height;
            if (bitmapRatio > 1) {
                width = maxSize;
                height = (int) (width / bitmapRatio);
            } else {
                height = maxSize;
                width = (int) (height * bitmapRatio);
            }
            return Bitmap.createScaledBitmap(image, width, height, true);
        }

        public Uri getOutputMediaFileUri() {
            return Uri.fromFile(getOutputMediaFile());
        }

    private File getOutputMediaFile() {
        // External sdcard location
      //  File mediaStorageDir = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "DeKa");
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "DeKa");
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                // Fehlerbehandlung, falls das Verzeichnis nicht erstellt werden kann
            }
        }

        // Create a media file name
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
      File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "image" + ".jpg");

        return mediaFile;
    }

我的provider_path是:

<?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="."/>
    </paths>

不幸的是,当我想使用相机在ImageView中加载图片时,我得到了这个消息:

Unable to decode stream: java.io.FileNotFoundException: /external_files/Pictures/DeKa/image.jpg: open failed: ENOENT (No such file or directory)

你有什么办法解决这个问题吗?谢谢你!

w80xi6nr

w80xi6nr1#

File outputFile = getOutputMediaFile();始终为null,因为它引用的假定文件不存在,即使它存在,相关方法中的代码也无法实现您想要的功能:它会从存储器中加载相同的图片,而不是从相机中拍摄的图片。
要从相机加载图片,请替换:

if (requestCode == REQUEST_CAMERA) {
   try {
       Log.e("CAMERA", fileUri.getPath());

       bitmap = BitmapFactory.decodeFile(fileUri.getPath());
       setToImageView(getResizedBitmap(bitmap, max_resolution_image));
   } catch (Exception e) {
       e.printStackTrace();
   }
}

有:

if (requestCode == REQUEST_CAMERA) {
   Bundle extras = data.getExtras();
   Bitmap bitmap = (Bitmap) extras.get("data");
   setToImageView(getResizedBitmap(bitmap, max_resolution_image));
}

可以看到,图像数据作为data参数传递给onActivityResult方法。使用此参数可解决您的问题。

相关问题