Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在android oreo更新中保存图像文件。怎么做?_Java_Android_Android 8.0 Oreo - Fatal编程技术网

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

Java 无法在android oreo更新中保存图像文件。怎么做?,java,android,android-8.0-oreo,Java,Android,Android 8.0 Oreo,我无法在android oreo(8.0)api 26中保存图像文件。 该代码在api级别25(7.0)中运行良好,我在文档中未发现任何更改“” 这是我的密码 String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); File myrootDir = new File(root); if (!myrootDir.exists()) { my

我无法在android oreo(8.0)api 26中保存图像文件。
该代码在api级别25(7.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);
}
异常是FileNotFoundException,没有这样的文件或目录。(但为什么不使用安卓n?)

java.io.FileNotFoundException:/storage/simulated/0/Pictures/Myimages/1513151272243myimage.png(没有这样的文件或目录)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:at java.io.FileOutputStream.open0(本机方法)
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.(FileOutputStream.java:223)
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:at java.io.FileOutputStream.(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:位于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:位于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(本机方法)
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:位于com.android.internal.os.zyote$MethodAndArgsCaller.run(zyote.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为目标的应用程序的权限发生了细微的变化

以前,如果给定组中至少有一个权限已由用户授予,则会自动向应用程序授予该组中的所有权限。这意味着,无论是否明确请求了
WRITE\u EXTERNAL\u STORAGE
,被授予
READ\u EXTERNAL\u STORAGE
的应用程序也会立即被授予
WRITE\u EXTERNAL\u STORAGE

从Oreo开始,对于针对API 26+的应用程序,这一点已得到纠正,只有明确请求的权限才会被授予。如果用户已在同一组中授予权限,则不会提示输入新权限,但仍必须请求

这就是问题所在,在这种情况下。当
读取外部存储
权限被授予牛轧糖或更低版本的应用程序时,您也会自动获得
写入外部存储
,而无需特别请求。当您在Oreo中尝试相同的文件保存过程时,您不会自动获得
WRITE\u EXTERNAL\u STORAGE
,因此写入最终会失败


只需为
写入外部存储添加特定请求
。如果用户已经授予了
读取外部\u存储
,他们就不会被另一个提示所困扰。或者,您可以从一开始就单独请求
WRITE\u EXTERNAL\u STORAGE
,其中隐式地包括
READ\u EXTERNAL\u STORAGE
,这样您就不需要两个单独的请求了。

我也遇到了同样的问题,我从两个月以来一直在处理这个问题。我已首先在清单中授予写入外部存储的权限,并再次检查它是否具有写入权限。我认为这不是许可问题。因为当我使用oreo进行测试时,文件夹正在创建,并且在我创建的文件夹中有一个损坏的图像文件。正因为如此,它不会进入图库,然后在保存时,它会将未捕获的图像返回给我。我只在android 7.1.1和oreo中遇到这个问题。在安卓7.0之前,它运行良好。我已经检查过三星galaxy note 8和谷歌pixel 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();
                        }
                    }

你有例外吗?请把它贴在这里哦,我看到你有一个空的catch块,请在catch块中添加一些日志。作为最佳实践,切勿将挡块留空。始终处理iti可以在android n中使用此代码保存图像。但是在android o中,没有:(@MikeM.check编辑。@Rinav谢谢你指出你能看看这个问题吗?
OutputStream output = null;
                    try {
                        output = new FileOutputStream(finalFile);
                        output.write(bytes);
                    } finally {
                        if (null != output) {
                            output.close();
                        }
                    }