gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:47:22 27 4
gpt4 key购买 nike

我无法在 android oreo(8.0) api 26 中保存图像文件。
代码在 api 级别 25 (7.0) 中运行完美,我在文档“Android 8.0 Behavior Changes”中没有发现任何更改

这是我的代码

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);
}

异常是 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)

最佳答案

事实上,在 API 26 上运行并以 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,这样您就不需要两个单独的请求。

关于java - 无法在 android oreo 更新中保存图像文件。怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47787577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com