无法在android oreo更新中保存图像文件.怎么做?

jom*_*rge 11 java android android-8.0-oreo

我无法在android oreo(8.0)api 26中保存图像文件.
代码在api级别25(7.0)中完美运行,我在文档" Android 8.0行为更改 "中没有找到任何更改

这是我的代码

String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File myrootDir = new File(root);
if (!myrootDir.exists()) {
    myrootDir.mkdir();
}

File myDir = new File(root + "/Myimages");
if (!myDir.exists()) {
    myDir.mkdir();
}
final String fname = System.currentTimeMillis()+"myimage.png";
File file = new File(myDir, fname);
if (file.exists())
    file.delete();
try {
    FileOutputStream out = new FileOutputStream(file);
    b.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.flush();
    out.close();
}catch (Exception e){
   Log.e("MYAPP", "exception", e);
}
Run Code Online (Sandbox Code Playgroud)

异常是FileNotFoundException,没有这样的文件或目录.(但为什么不在android n?)

java.io.FileNotFoundException: /storage/emulated/0/Pictures/Myimages/1513151272243myimage.png (No such file or directory)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at java.io.FileOutputStream.open0(Native Method)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at java.io.FileOutputStream.open(FileOutputStream.java:287)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:223)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:     at com.package.package.DetailPage$12.run(DetailPage.java:737)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at android.os.Handler.handleCallback(Handler.java:789)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at android.os.Looper.loop(Looper.java:164)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6541)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Run Code Online (Sandbox Code Playgroud)

Mik*_* M. 16

事实上,在运行和定位API 26的应用的权限中有轻微的细微变化.

以前,如果用户授予该组中至少一个权限,则会自动为应用授予给定组中的所有权限.这意味着,无论是否已明确请求,已经被授予的应用程序READ_EXTERNAL_STORAGE也会WRITE_EXTERNAL_STORAGE立即被授予它WRITE_EXTERNAL_STORAGE.

从Oreo开始,对于针对API 26+的应用,此问题已得到纠正,并且只会授予明确请求的权限.如果用户已在同一组中授予权限,则不会提示新权限,但仍必须请求该权限.

在这种情况下,这就是问题所在.当READ_EXTERNAL_STORAGE您在Nougat或以下的应用程序上授予权限时,您也可以自动获取WRITE_EXTERNAL_STORAGE,而无需专门请求该权限.当您在Oreo中尝试相同的文件保存过程时,您没有WRITE_EXTERNAL_STORAGE自动获取,因此写入最终会失败.

只需添加特定请求即可WRITE_EXTERNAL_STORAGE.如果用户已经授予READ_EXTERNAL_STORAGE,他们将不会被另一个提示困扰.或者,您可以仅从WRITE_EXTERNAL_STORAGE一开始就请求,这隐含地包含READ_EXTERNAL_STORAGE,并且可以节省您对两个单独请求的需求.

  • 非常感谢你 :) (3认同)