即使在应用程序(Marshmallow)中请求权限后仍然无法访问外部存储中的文件,是否需要重新启动应用才能获取访问权限?

时间:2016-01-14 17:44:17

标签: android android-6.0-marshmallow android-permissions

我正在使用Marshmallow在模拟器中进行测试。这就是我所做的:首次启动应用程序时,我检查了相机/存储权限是否打开。如果不是,我会要求获得以下权限:Manifest.permission.CAMERAManifest.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);

所以看起来在应用程序中以编程方式请求权限时,如果签入设置,它会立即显示,但实际的授权在您关闭应用并重新启动之后才会生效它又来了?!

我在某处读到,如果在您的应用运行时通过设置手动撤销权限,该应用将自行终止。

3 个答案:

答案 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并在此手机中进行了测试,我在模拟器中遇到的问题在问题中已经没有了!