从相机捕获图像并裁剪不工作

Posted

技术标签:

【中文标题】从相机捕获图像并裁剪不工作【英文标题】:capture image from camera and crop not working 【发布时间】:2017-07-24 11:14:18 【问题描述】:

这是我的相机意图。

            File file = getExternalFilesDir(Environment.DIRECTORY_DCIM);
            file.mkdirs();
            File output = new File(file, "profile_image");
            if (output.exists()) 
                output.delete();
            
            Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, output);
            startActivityForResult(captureIntent, PublicValues.IMAGE_FROM_CAMERA);

在活动结果中

if (requestCode == PublicValues.IMAGE_FROM_CAMERA)  

                if (mPhotoUri != null) 
                    performCrop(mPhotoUri);
                 else 
                    pictureUri = data.getData();
                    performCrop(pictureUri);
                

和裁剪意图

            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            cropIntent.setDataAndType(picUri, "image/*");
            cropIntent.putExtra("crop", "true"); // set crop properties
            cropIntent.putExtra("aspectX", 1);  // indicate aspect of desired crop(ratio)
            cropIntent.putExtra("aspectY", 1);
            cropIntent.putExtra("return-data", true); // retrieve data on return
            cropIntent.putExtra("outputX", profileImage.getWidth());   // indicate output X and Y
            cropIntent.putExtra("outputY", profileImage.getHeight());

            startActivityForResult(cropIntent, PublicValues.IMAGE_CROP);

它在 API 19 设备上运行良好,但在 Marshmallow 设备中崩溃。

崩溃报告是这样的:-

Caused by android.os.FileUriExposedException: file:///storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20170721-WA0014.jpg exposed beyond app through Intent.getData()
android.os.StrictMode.onFileUriExposed (StrictMode.java:1813)
android.net.Uri.checkFileUriExposed (Uri.java:2360)
android.content.Intent.prepareToLeaveProcess (Intent.java:8981)
android.content.Intent.prepareToLeaveProcess (Intent.java:8942)
android.app.Instrumentation.execStartActivity (Instrumentation.java:1583)
android.app.Activity.startActivityForResult (Activity.java:4228)
android.support.v4.app.BaseFragmentActivityJB.startActivityForResult (BaseFragmentActivityJB.java:50)
android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:79)

【问题讨论】:

能贴出错误日志吗? @AjilO。查看我的编辑 所有权限都授予您的应用,对吗?? @GaganDeep yup.CAMERA,读写外部存储 Android 没有CROP Intent。有很多image cropping libraries available for Android。请使用一个。 【参考方案1】:

使用 Gradle:

compile 'com.theartofdev.edmodo:android-image-cropper:2.3.+'

试试这个:

private void performCrop(Uri imageUri) 
    CropImage.activity(imageUri)
            .setGuidelines(CropImageView.Guidelines.ON)
            .setCropShape(CropImageView.CropShape.RECTANGLE)
            .setAspectRatio(1, 1)
            .setMultiTouchEnabled(true)
            .start(this);

【讨论】:

在你的项目中实现这个 gradle 文件并在你的类中编写这个方法,然后使用你想要裁剪的 imageUri 参数调用这个 performCrop() 方法。 只是对 Stuti Kasliwal 的回答的一点补充。要使其正常工作,您需要将 <activity android:name="com.theartofdev.edmodo.cropper.CropImageActivity"/> 添加到 AndroidManifest。您还必须在裁剪后处理保存和传递图像。

以上是关于从相机捕获图像并裁剪不工作的主要内容,如果未能解决你的问题,请参考以下文章

Android:在捕获或从图库中挑选后裁剪图像

我想裁剪图像并输入在图像中查看。如何使用这种类型的裁剪从相机裁剪图像?

从相机裁剪图像并保存

在 Swift 中从相机中裁剪图像而不移动到另一个 ViewController

如何裁剪图像并将其存储在 gridview 中?

从相机胶卷导入图像并裁剪