![](/img/trans.png)
[英]File not found exception:java.io.FileNotFoundException: /storage/emulated/0/image.jpg: open failed: ENOENT (No such file or directory)
[英]java.io.FileNotFoundException: /storage/emulated/0/saved_images/grub.jpg: open failed: ENOENT (No such file or directory)
正在使用以下代码将图像保存在 SD 卡中,但我不断收到以下异常
private void SaveImage(Bitmap finalBitmap,String filename) {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/saved_images");
myDir.mkdirs();
String fname = filename;
File file = new File (myDir, fname);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
我在这里错过了什么吗?
修改您的代码,因为您没有创建目录:
private void SaveImage(Bitmap finalBitmap,String filename) {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/saved_images");
myDir.mkdirs();
String fname = filename;
File file = new File (myDir, fname);
if (file.exists ()) file.delete ();
file.createNewFile();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
如果您在 Android 版本 10 中遇到此问题,请打开清单文件并将此行添加到您的应用程序标记中。
<application android:requestLegacyExternalStorage="true" .....>
这个问题是因为在 Android 10 中引入了作用域存储。并确保您在清单中添加权限请求并从用户那里获取运行时权限。 在最新的 android 版本中,您需要用户的运行时权限。
这就是我在检查文本文件中的时间戳时从存储中读取文件的方式。 第 2 行可能是您的最佳选择。
File root = android.os.Environment.getExternalStorageDirectory();
File dir = new File(root.getAbsolutePath() + "/path");
dir.mkdirs();
File file = new File(dir, ".storage.txt");
Reader pr;
String line = "";
try {
pr = new FileReader(file);
int data = pr.read();
while (data != -1) {
line += (char) data;
data = pr.read();
}
pr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//do stuff with line
从 Android 6.0.0 开始,您需要使用以下代码:
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)
确保您将权限放在清单上:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果您在 Android 版本 10 中遇到此问题,请打开清单文件并将此行添加到您的应用程序标记中。
<应用程序android:requestLegacyExternalStorage="true" .....>
从 SDK 版本 30 开始,您不能扩展android:requestLegacyExternalStorage="true"
。 而是稍微修改您的 ImageLoader 库。 我看到你必须修改你的文件路径: File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "saved_images");
进入类似File dir = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "saved_images");
. 这应该有技巧。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.