摄像机结果始终返回RESULT_CANCELED

Mul*_*ard 11 android android-camera

我想用相机拍照.我只是暂时需要它们,所以我做了以下事情:

private void takePicture() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    if (intent.resolveActivity(this.getActivity().getPackageManager()) != null) {
        try {
            this.imageFile = File.createTempFile("CROP_SHOT", ".jpg", this.getActivity().getCacheDir());

            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.imageFile));
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

            this.startActivityForResult(intent, Globals.REQUEST_TAKE_PHOTO);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的RESULT_CANCELED是我的结果代码onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.v("PictureEdit", "onActivityResult");

    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode == Activity.RESULT_OK) {
        if(requestCode == Globals.REQUEST_TAKE_PHOTO) {
            Log.v("PictureEdit", "onActivityResult take photo");

            this.startCropImage(Uri.fromFile(this.imageFile));
        } else if (requestCode == Globals.REQUEST_PICK_PHOTO) {
            Log.v("PictureEdit", "onActivityResult pick photo");

            this.startCropImage(data.getData());
        } else if (requestCode == Globals.REQUEST_CROP_PHOTO) {
            Log.v("PictureEdit", "onActivityResult crop photo");

            this.imageEncoded = data.getStringExtra(Globals.KEY_IMAGE_ENCODED);

            this.imageView.setImageBitmap(Images.decodeImage(imageEncoded));
            this.buttonSave.setEnabled(true);
        } else {
            Log.v("PictureEdit", "onActivityResult requestCode: " + requestCode + ", result: " + resultCode);
        }
    } else {
        Log.v("PictureEdit", "onActivityResult resultCode is not ok: " + resultCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

我到目前为止在stackoverflow和网络上找到的每个解决方案都没有解决我的问题.我使用缓存目录来创建临时文件:

File.createTempFile("CROP_SHOT", ".jpg", this.getActivity().getCacheDir());
Run Code Online (Sandbox Code Playgroud)

我有正确的权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)

从我的智能手机中挑选图像总是很好:

private void pickPicture() {
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

    this.startActivityForResult(intent, Globals.REQUEST_PICK_PHOTO);
}
Run Code Online (Sandbox Code Playgroud)

那么为什么相机总会回来RESULT_CANCELED

它出现在Android 6.0的Nexus 4和Android 4.2的三星Galaxy S III上.

Com*_*are 14

我使用缓存目录来创建临时文件:

首先,第三方相机应用程序无权使用内部存储上的应用程序的专用缓存目录.

其次,您不应该创建该文件.相机应用程序应该创建该文件.某些相机应用可能会感到困惑并拒绝覆盖您的文件.

因此,创建File指向外部存储上的位置的对象(例如getExternalCacheDir()),但不要创建该文件.使用该File对象作为您的EXTRA_OUTPUT价值的基础.

另请注意,这MediaStore.EXTRA_VIDEO_QUALITY是录制视频; 它没有任何意义ACTION_IMAGE_CAPTURE.