我正在使用Marshmallow在模拟器中进行测试。这就是我所做的:首次启动应用程序时,我检查了相机/存储权限是否打开。如果不是,我会要求获得以下权限:Manifest.permission.CAMERA
,Manifest.permission.WRITE_EXTERNAL_STORAGE
。在后面的屏幕中,我推出了一个选择器,提供从相机拍摄电话或从画廊加载的选项。在此过程中,图像将保存在外部存储中。
这就是我的所作所为:
我在系统对话框提示时同时授予了Camera和Storage的权限。然后,我选择从图库加载。在此过程中,我会在某个时刻调用此方法来获取图像:
Bitmap scaledBitmap = BitmapFactory.decodeFile(imagePath, options);
其中imagePath
是外部存储中的路径。在Marshmallow中,上面的行生成了这个错误:
无法解码流:java.io.FileNotFoundException: /storage/1E03-0606/IMG_1452715979191.jpg :打开失败:EACCES(权限被拒绝)
从上面的错误消息中,即使在我授予存储权限之后,仍然拒绝访问存储的权限(我在系统对话框中单击“允许”后双重检查设置 ,相机和存储都已开启。)
我进一步检查imagePath
以确保它存在并且是一个文件:
File f = new File(imagePath);
if(f.exists() && f.isFile()){
System.out.println("file \"" + imagePath + "\" exists & is a file." );
}
所以这意味着我确实已经在存储中生成了文件,但即使我已经从系统对话框中授予了该权限,仍然会拒绝该权限。
观察:我杀了应用程序并再次启动它。现在的相机&存储权限已启用,因为我之前从系统对话框中授予了它,这次,上面的代码可以工作:
Bitmap scaledBitmap = BitmapFactory.decodeFile(imagePath, options);
所以看起来在应用程序中以编程方式请求权限时,如果签入设置,它会立即显示,但实际的授权在您关闭应用并重新启动之后才会生效它又来了?!
我在某处读到,如果在您的应用运行时通过设置手动撤销权限,该应用将自行终止。
答案 0 :(得分:0)
但实际的授权只有在您关闭应用并再次重新启动之后才会生效?!!
不,这不正确 - 您立即获得许可/访问权。
只是为了澄清,仅仅因为您现在可以访问文件系统,并不意味着您可以访问所有文件 - 您仍然必须在文件权限系统内工作(以便应用程序无法访问彼此的数据库例子)。
如果没有更多信息,我们无法知道具体问题是什么,但请确保在您编写并关闭文件处理程序后立即进行f.exists() && f.isFile()
检查 - 这很可能当您尝试按FileNotFoundException
异常读取文件时,该文件根本不存在。
答案 1 :(得分:0)
您可能需要进行媒体扫描才能让系统识别您的文件。我在下载文件时遇到了同样的问题,这段代码对我有用:
File file = new File(imagePath);
try {
FileOutputStream fos = new FileOutputStream(file);
boolean weAreOK = mFTPClient.retrieveFile(files[i].getName(), fos);
fos.flush();
fos.getFD().sync();
MediaScannerConnection.scanFile(this,
new String[]{file.toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
fos.close();
} catch (Exception e) {
Log.d("File Exception", e.toString());
}
答案 2 :(得分:0)
我正在使用Marshmallow在模拟器中进行测试,今天早上我将手机更新到Android 6.0.1并在此手机中进行了测试,我在模拟器中遇到的问题在问题中已经没有了!