写入外部权限被拒绝

时间:2017-09-08 20:33:23

标签: java android android-external-storage

我遇到了将图片保存到手机的问题外部存储(获得权限被拒绝)在搜索解决方案时我发现了3个不同的答案。

第一个是Manifest文件中的uses-permission,我已经有了这个,但我尝试在清单中移动它而没有运气。

第二个是,如果它的API 23或更高版本必须请求权限而不是在清单中,但我使用的是API 15.

最后,因为它是一个物理电话,而不是一个模拟器,有人说它在插入计算机时无法访问外部存储器(因为计算机正在访问它)但我的手机只能充电,我也试过拔掉它没有运气

我能想到的唯一另一件事是手机是谷歌Pixel所以它没有SD卡但我在机器人网站上读到没有SD卡选项的设备有外部存储器的分区

我错过了什么吗?

杰克

编辑:

代码块:

private void takeScreenshot() {
    Date now = new Date();
    android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);

try {
    String mPath = Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES).getAbsolutePath()
             +"/Screenshots/image"+now;

    // create bitmap screen capture
    View v1 = getWindow().getDecorView().getRootView();
    v1.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);

    File imageFile= new File(mPath);

    Log.e("ERROR",mPath);

    FileOutputStream outputStream =
       new FileOutputStream(imageFile);
    int quality = 100;
    bitmap.compress(Bitmap.CompressFormat.JPEG,
        quality, outputStream);
    outputStream.flush();
    outputStream.close();
} catch (Throwable e) {
    e.printStackTrace();
}
}

错误日志:

09-08 16:59:25.774 13514-13514/com.example.jake.wellsfargo E/ERROR: /storage/emulated/0/Pictures/Screenshots/imageFri Sep 08 16:59:25 EDT 2017
09-08 16:59:25.776 13514-13514/com.example.jake.wellsfargo W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Pictures/Screenshots/imageFri Sep 08 16:59:25 EDT 2017 (Permission denied)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at java.io.FileOutputStream.open(Native Method)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at com.example.jake.wellsfargo.MainActivity.takeScreenshot(MainActivity.java:317)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at com.example.jake.wellsfargo.MainActivity.access$100(MainActivity.java:48)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at com.example.jake.wellsfargo.MainActivity$2.onClick(MainActivity.java:84)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at android.view.View.performClick(View.java:5637)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at android.view.View$PerformClick.run(View.java:22429)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at android.os.Looper.loop(Looper.java:154)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6121)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
09-08 16:59:25.777 13514-13514/com.example.jake.wellsfargo W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

1 个答案:

答案 0 :(得分:0)

https://www.captechconsulting.com/blogs/runtime-permissions-best-practices-and-how-to-gracefully-handle-permission-removal

Android为Android 6.0(Marshmallow)添加了新的权限模型

什么是运行时权限?

借助Android 6.0 Marshmallow,Google引入了一种新的权限模型,允许用户更好地理解应用程序可能要求特定权限的原因。现在,系统会提示用户在应用程序使用期间必要时接受权限,而不是用户在安装时盲目接受所有权限。

https://github.com/codepath/android_guides/wiki/Accessing-the-Camera-and-Stored-Media

注意:从Marshmallow开始,权限模型已更改。如果您的targetSdkVersion&gt; = 23并且您在Marshmallow(或更高版本)设备上运行,则可能需要启用运行时权限。您还应该阅读有关运行时权限更改的更多信息。

如果您使用的是targetSdkVersion&gt; = 24,则还必须将FileProvider配置为本节中显示。以下示例使用com.codepath.fileprovider,并且应与指定的权限XML标记匹配。

另见https://stackoverflow.com/a/44455957/966789