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

问题描述 投票:10回答:2

我无法在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)
java android android-8.0-oreo
2个回答
15
投票

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

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

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

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

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


1
投票

我也遇到了同样的问题,我在2个月内遇到了这个问题。我已经首先在清单中授予WRITE_EXTERNAL_STORAGE权限,并再次检查它是否具有写入权限。我认为这不是许可问题。因为当我使用oreo测试文件夹正在创建时,我正在创建的文件夹中存在损坏的图像文件。因为它没有进入画廊,然后在保存它返回我图像没有捕获。我只在android 7.1.1和oreo中遇到这个问题。 Upto android 7.0它运行正常。我已经检查过设备三星galaxy note 8和谷歌像素xl 2.我正在使用带有gps及以下功能的自定义相机

public void onImageAvailable(ImageReader reader) {
                    Image image = null;
                    try {
                        image = reader.acquireLatestImage();
                        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                        byte[] bytes = new byte[buffer.capacity()];
                        buffer.get(bytes);
                        save(bytes);

用于图像字节保存,保存功能包含以下代码

OutputStream output = null;
                    try {
                        output = new FileOutputStream(finalFile);
                        output.write(bytes);
                    } finally {
                        if (null != output) {
                            output.close();
                        }
                    }
© www.soinside.com 2019 - 2024. All rights reserved.