无法在 android oreo 更新中保存图像文件。怎么做?
Unable to save image file in android oreo update. How to do it?
我无法在 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.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.
的应用程序 运行 的权限有细微的变化
以前,如果用户已授予给定组中的至少一项权限,则应用会自动授予该组中的所有权限。这意味着已被授予 READ_EXTERNAL_STORAGE
的应用程序也会立即被授予 WRITE_EXTERNAL_STORAGE
,无论是否已明确请求 WRITE_EXTERNAL_STORAGE
。
自 Oreo 起,对于面向 API 26 岁以上的应用,此问题已得到纠正,并且只会授予那些明确请求的权限。如果用户已经授予同组权限,则不会提示新权限,但仍需申请。
在这种情况下,这就是问题所在。当 READ_EXTERNAL_STORAGE
权限被授予您的牛轧糖或更低版本的应用程序时,您也会自动获得 WRITE_EXTERNAL_STORAGE
,而无需专门请求该权限。当您在 Oreo 中尝试相同的文件保存过程时,您不会自动获得 WRITE_EXTERNAL_STORAGE
,因此写入最终会失败。
只需添加 WRITE_EXTERNAL_STORAGE
的特定请求。如果用户已经授予 READ_EXTERNAL_STORAGE
,他们将不会被另一个提示所打扰。或者,您可以从一开始就只请求 WRITE_EXTERNAL_STORAGE
,这隐含地包含 READ_EXTERNAL_STORAGE
,这样您就不需要两个单独的请求。
我也遇到了同样的问题,我从 2 个月起就一直被这个问题困扰。我已经首先在清单中授予 WRITE_EXTERNAL_STORAGE 权限,然后再次检查它是否具有写入权限。我认为这不是权限问题。因为当我用奥利奥测试时,文件夹正在创建,并且我正在创建的文件夹中有一个损坏的图像文件。因此它不会进入画廊然后保存它 returns 我没有捕获图像。我只在 android 7.1.1 和 oreo 中遇到这个问题。直到 android 7.0 它工作正常。我已经检查过设备 samsung galaxy note 8 和 google 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();
}
}
我无法在 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.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.
的应用程序 运行 的权限有细微的变化以前,如果用户已授予给定组中的至少一项权限,则应用会自动授予该组中的所有权限。这意味着已被授予 READ_EXTERNAL_STORAGE
的应用程序也会立即被授予 WRITE_EXTERNAL_STORAGE
,无论是否已明确请求 WRITE_EXTERNAL_STORAGE
。
自 Oreo 起,对于面向 API 26 岁以上的应用,此问题已得到纠正,并且只会授予那些明确请求的权限。如果用户已经授予同组权限,则不会提示新权限,但仍需申请。
在这种情况下,这就是问题所在。当 READ_EXTERNAL_STORAGE
权限被授予您的牛轧糖或更低版本的应用程序时,您也会自动获得 WRITE_EXTERNAL_STORAGE
,而无需专门请求该权限。当您在 Oreo 中尝试相同的文件保存过程时,您不会自动获得 WRITE_EXTERNAL_STORAGE
,因此写入最终会失败。
只需添加 WRITE_EXTERNAL_STORAGE
的特定请求。如果用户已经授予 READ_EXTERNAL_STORAGE
,他们将不会被另一个提示所打扰。或者,您可以从一开始就只请求 WRITE_EXTERNAL_STORAGE
,这隐含地包含 READ_EXTERNAL_STORAGE
,这样您就不需要两个单独的请求。
我也遇到了同样的问题,我从 2 个月起就一直被这个问题困扰。我已经首先在清单中授予 WRITE_EXTERNAL_STORAGE 权限,然后再次检查它是否具有写入权限。我认为这不是权限问题。因为当我用奥利奥测试时,文件夹正在创建,并且我正在创建的文件夹中有一个损坏的图像文件。因此它不会进入画廊然后保存它 returns 我没有捕获图像。我只在 android 7.1.1 和 oreo 中遇到这个问题。直到 android 7.0 它工作正常。我已经检查过设备 samsung galaxy note 8 和 google 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();
}
}