在ACTION_IMAGE_CAPTURE意图中拍照后,文件中的“权限被拒绝”

时间:2016-06-24 12:56:11

标签: java android android-intent

在我的活动中,我有以下代码:

public void myMethod() {
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
    root.mkdirs();
    final String fname = "img_" + System.currentTimeMillis() + ".jpg";
    outputFileUri = Uri.fromFile(new File(root, fname));

    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePhotoIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, outputFileUri);
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 232);
    startActivityForResult(takePhotoIntent, 1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 232) {
        myMethod();
    } else {
        System.out.println("returned...");
        ImageView imageView = (ImageView) findViewById(R.id.test_image_view);
        imageView.setImageURI(outputFileUri);
    }
}

我的测试设备是Android 6.0.1上的root连接6。当调用“myMethod”时,它可以让我拍摄照片,但在返回活动时我收到以下错误:

java.io.FileNotFoundException: /storage/emulated/0/MyDir/img_1466772411267.jpg: open failed: EACCES (Permission denied)

我在清单中声明了有效权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-feature android:name="android.hardware.camera"/>

这个错误发生在方法结束时(我猜是因为先前需要一些时间来抛出错误?)无论如何,从我看到的,我似乎按照我应该的方式做事。有什么事吗?

2 个答案:

答案 0 :(得分:0)

您的代码将在Android 5.0中运行,但不会在marshmallow os中运行。

从Android 6.0开始(API级别23),用户在应用运行时向应用授予权限,而不是在他们安装应用时,即使您已在清单文件中授予权限。

因此,应用程序需要在运行时询问用户的权限,如果用户未提供该权限,您将获得权限拒绝错误。所以你必须为此管理代码。

有关详细信息,请参阅以下链接: https://developer.android.com/training/permissions/requesting.html

答案 1 :(得分:0)

Android 6.0的运行时权限

$newQ.hide();
$newQ.fadeIn();