Android 6.0+ java.io.FileNotFoundException : (Permission denied)

标签 android permissions android-manifest android-6.0-marshmallow

最近,我遇到了一个关于权限问题的非常奇怪的问题,它困惑了我几天,我希望有人能帮助我弄清楚发生了什么事。谢谢!

问题是这样的: 由于某种原因,我需要申请存储权限来保存一些照片,并且我已将权限添加到 AndroidManifestival.xml:

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

当然,我知道在Android 6.0之后我必须在代码中申请存储权限,这是我申请权限的代码:

public static boolean isGrantExternalRW(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && (context.checkSelfPermission(
            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {

        ((Activity)context).requestPermissions(new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        }, Constants.PERMISSION_REQUEST_CODE);

        return false;
    }

    return true;
}

我在保存照片之前就使用过这个方法,并且出现了权限对话框,我已经检查过了。我已经在应用程序设置中检查了应用程序权限,没有问题。

这是我用来将位图保存到文件的方法:

public static String savePhotoToSDCard(Bitmap bitmap, String photoName) {
    String absolutePath = "";

    String state = Environment.getExternalStorageState();
    Log.e("file", "---------------------" + state);
    File newsDir =  new File(Environment.getExternalStorageDirectory().toString()
            + File.separator + "photo");


    if (!newsDir.exists()) {
        newsDir.mkdirs();
    }

    File picFile = new File(newsDir, photoName + ".png");
    absolutePath = picFile.getAbsolutePath();

    if (picFile.exists()) {
        picFile.delete();
    }

    if (photoName.equals("avatar")) {          
        int ratio = 2;        
        Bitmap result = Bitmap.createBitmap(bitmap.getWidth() / ratio, bitmap.getHeight() / ratio, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        Rect rect = new Rect(0, 0, bitmap.getWidth() / ratio, bitmap.getHeight() / ratio);
        canvas.drawBitmap(bitmap, null, rect, null);
    }

    try {
        FileOutputStream fileOutputStream = new FileOutputStream(picFile);
        if (bitmap != null) {

            if (bitmap.compress(Bitmap.CompressFormat.PNG, 30, fileOutputStream)) {
                fileOutputStream.flush();
                Log.d("Photo", "---------------------------fileOutputStream.flush");
                fileOutputStream.close();
            }
        }
    } catch (FileNotFoundException e) {
        Log.e("File", "----------------------------" + e.toString());
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return absolutePath;
}

当我运行应用程序时,出现错误,日志如下:

java.io.FileNotFoundException: /storage/emulated/photo/avatar.png(permission denied)

但最奇怪的是,当我在AndroidManifestival.xml中添加两次存储权限时,它起作用了!

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

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

那么,问题出在哪里呢?请帮忙。

最佳答案

幸运的是,我的问题终于解决了。原因如下: 存储权限与以下依赖冲突:

compile 'com.github.vungle:vungle-android-sdk:5.3.0'

当我添加依赖时,系统无法识别我申请的存储权限(虽然我在AndroidManifest.xml中添加了两次,但它有效),但是当我删除它时,一切正常!这个依赖项曾用于将广告添加到应用程序中,但现在我必须放弃它。

关于Android 6.0+ java.io.FileNotFoundException : (Permission denied),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47198045/

相关文章:

android - 为什么我不能在 Manifest 文件中使用属性 installLocation?

linux - Ubuntu 和 Mavericks 之间 cifs 挂载的权限问题

安卓。锁定所有 Activity 的屏幕方向

android - 与电话号码联系的 Intent

java - 使上传的图像在布局/Activity 更改后保留

linux - 一个一般的 linux 文件权限问题 : Apache and WordPress

permissions - 更新通过 JungleDisk 上传的 Amazon S3 文件的权限

android - java.lang.RuntimeException: list 合并失败,出现多个错误

java - 如何在 HTTP post 请求的消息正文中附加 XML 文件?

android - 创建通知而不弹出