在我的活动中,我有以下代码:
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"/>
这个错误发生在方法结束时(我猜是因为先前需要一些时间来抛出错误?)无论如何,从我看到的,我似乎按照我应该的方式做事。有什么事吗?
答案 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();