尝试从数据库加载图像时没有找到这样的文件或目录?
No such file or directory found when trying to load image from database?
我都这样,我已经把我的图片保存到外部目录了:
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Images");
imagesFolder.mkdirs();
image = new File(imagesFolder.getPath(), "MyImage_" + timeStamp + ".jpg");
fileUri = Uri.fromFile(image);
然后像这样将图像保存在数据库(SQLite)中:
contentValues.put(LocationsDB.FIELD_FILEPATH, fileUri.toString());
加载图片到imageView时:
String theimage = null;
.....
theimage = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_FILEPATH));
.....
final Bitmap myImage = BitmapFactory.decodeFile(theimage);
ImageView image = (ImageView) findViewById(R.id.PicView);
image.setImageBitmap(myImage);
但是当 运行 应用程序出现此错误时:
01-10 12:12:26.943: E/BitmapFactory(30607): Unable to decode stream: java.io.FileNotFoundException: /file:/storage/emulated/0/Images/MyImage_20150110_121217.jpg: open failed: ENOENT (No such file or directory)
我在这里做错了什么?我以为这样就可以获取图像并显示图像了?
首先确保您的图像存储在 Image
文件夹中
但是你的问题是 fromFile()
方法,它将 file://
添加到你的图像的绝对路径,所以 BitmapFactory
找不到你的图像并抛出 java.io.FileNotFoundException
.
你的图片地址是
file:///storage/emulated/0/Images/MyImage_1234.jpg
而不是
/storage/emulated/0/Images/MyImage_1234.jpg
尝试改变
contentValues.put(LocationsDB.FIELD_FILEPATH, fileUri.toString());
到
contentValues.put(LocationsDB.FIELD_FILEPATH, image.getAbsolutePath());
问题是 new File()
没有创建文件。它创建一个指向该位置的指针。
您需要使用 OutputStream 来保存该文件:
// Open file
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Images");
imagesFolder.mkdirs();
File image = new File(imagesFolder.getPath(), "MyImage_.jpg");
// Create it if it doesn't exist
if (!image.exists()) {
try {
// Create file
FileOutputStream outputStream = new FileOutputStream(image);
outputStream.write("Hello".getBytes());
outputStream.close();
// Save ABSOLUTE_PATH to DB
contentValues.put(LocationsDB.FIELD_FILEPATH, image.getAbsolutePath());
...
} catch (IOException e) {
e.printStackTrace();
}
}
然后从数据库中获取路径并使用
String absPath = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_FILEPATH));
final Bitmap myImage = BitmapFactory.decodeFile(absPath);
我都这样,我已经把我的图片保存到外部目录了:
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Images");
imagesFolder.mkdirs();
image = new File(imagesFolder.getPath(), "MyImage_" + timeStamp + ".jpg");
fileUri = Uri.fromFile(image);
然后像这样将图像保存在数据库(SQLite)中:
contentValues.put(LocationsDB.FIELD_FILEPATH, fileUri.toString());
加载图片到imageView时:
String theimage = null;
.....
theimage = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_FILEPATH));
.....
final Bitmap myImage = BitmapFactory.decodeFile(theimage);
ImageView image = (ImageView) findViewById(R.id.PicView);
image.setImageBitmap(myImage);
但是当 运行 应用程序出现此错误时:
01-10 12:12:26.943: E/BitmapFactory(30607): Unable to decode stream: java.io.FileNotFoundException: /file:/storage/emulated/0/Images/MyImage_20150110_121217.jpg: open failed: ENOENT (No such file or directory)
我在这里做错了什么?我以为这样就可以获取图像并显示图像了?
首先确保您的图像存储在 Image
文件夹中
但是你的问题是 fromFile()
方法,它将 file://
添加到你的图像的绝对路径,所以 BitmapFactory
找不到你的图像并抛出 java.io.FileNotFoundException
.
你的图片地址是
file:///storage/emulated/0/Images/MyImage_1234.jpg
而不是
/storage/emulated/0/Images/MyImage_1234.jpg
尝试改变
contentValues.put(LocationsDB.FIELD_FILEPATH, fileUri.toString());
到
contentValues.put(LocationsDB.FIELD_FILEPATH, image.getAbsolutePath());
问题是 new File()
没有创建文件。它创建一个指向该位置的指针。
您需要使用 OutputStream 来保存该文件:
// Open file
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Images");
imagesFolder.mkdirs();
File image = new File(imagesFolder.getPath(), "MyImage_.jpg");
// Create it if it doesn't exist
if (!image.exists()) {
try {
// Create file
FileOutputStream outputStream = new FileOutputStream(image);
outputStream.write("Hello".getBytes());
outputStream.close();
// Save ABSOLUTE_PATH to DB
contentValues.put(LocationsDB.FIELD_FILEPATH, image.getAbsolutePath());
...
} catch (IOException e) {
e.printStackTrace();
}
}
然后从数据库中获取路径并使用
String absPath = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_FILEPATH));
final Bitmap myImage = BitmapFactory.decodeFile(absPath);