我有一个食谱数据库,每个食谱都有一个图像。
可以从JSON提要更新数据库。然后,我需要为新添加的配方检索任何新图像。我在从URL获取图像,保存图像然后使用该图像更新配方时遇到问题。
Stack Overflow和其他网站上有很多不同的答案。通常我可以达到我期望的工作点。图像似乎被保存,我添加的任何调试打印输出显示我的期望,但我无法更新我的ImageView。我的意思是它仍然是空白的。
我不确定我的问题是否只是尝试更新ImageView,或者在保存图像时出现问题。这段代码目前有点草率和低效。我已经从建议的其他帖子尝试了10-15个变种,但没有运气。任何帮助将不胜感激。
清单
/* I have these two set (Not sure both are necessary) */
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
主要前端课程
/* Create databaseHelper */
DatabaseHelper db = new DatabaseHelper(getApplicationContext());
/* ImageView to update image of */
ImageView foodpic = (ImageView)findViewById(R.id.foodpic);
/* Check if image is already available in drawable folder */
int resID = this.getResources().getIdentifier(filename, "drawable", "mypackage.name");
if (resID == 0) {
/* If not, call function to retrieve from external storage */
newPic = db.getOutputMediaFile(origFilename);
if(newPic.exists()) {
myBitmap = BitmapFactory.decodeFile(newPic.getAbsolutePath());
foodpic.setImageBitmap(myBitmap);
foodpic.invalidate(); /* Tried with and without this */
}
}
DatabaseHelper函数,用于检索从URL保存的图像
public File getOutputMediaFile(String filename){
/* Dir I'm (attempting) to save and retrieve images from */
File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/Android/data/mypackage.name/Files");
/* Create the storage directory if it does not exist */
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
return null;
}
}
/* Get file extension */
String[] fileNameSplit = filename.split("\\.");
String extension = fileNameSplit[(fileNameSplit.length-1)];
/* Get filename, remove special chars & make lowercase */
int extensionIndex = filename.lastIndexOf(".");
filename = filename.substring(0, extensionIndex);
filename = filename.toLowerCase(Locale.getDefault());
filename = filename.replaceAll("[^a-z0-9]", "");
/* Re-make filename to save image as */
String mImageName="r"+filename+"."+extension;
/* Get file
mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
return mediaFile;
}
DatabaseHelper函数,用于保存网址中的图片 - 如果在可绘制文件夹中找不到图像,则按照添加到数据库的配方/图像调用。
public static void saveImage(String imageUrl, String destinationFile, String extension) throws IOException {
URL url = new URL (imageUrl);
InputStream input = url.openStream();
try {
File storagePath = Environment.getExternalStorageDirectory();
OutputStream output = new FileOutputStream (new File(storagePath,destinationFile));
try {
byte[] buffer = new byte[2048];
int bytesRead = 0;
while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
output.write(buffer, 0, bytesRead);
}
} finally {
output.close();
}
} finally {
input.close();
}
*格式化。
答案 0 :(得分:1)
将URL存储为数据库中的字符串并使用Image Loader显示它更容易,但不能脱机工作,如果你的应用程序需要互联网工作,图像加载器可能会更好。 android-loading-image-from-url-http
答案 1 :(得分:0)
我最终使用了这个库。
这不是一个理想的解决方案,因为我更喜欢浏览这个库,完全理解它并为可能需要类似答案的其他人解释它。但就目前而言,尝试做类似事情的人也应该能够使用它。