Java 无法在android oreo更新中保存图像文件。怎么做?
我无法在android oreo(8.0)api 26中保存图像文件。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
该代码在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();
}
}