Android - 从URL获取,保存和检索图像

时间:2014-02-24 10:35:35

标签: android image

我有一个食谱数据库,每个食谱都有一个图像。

可以从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();
}

*格式化。

2 个答案:

答案 0 :(得分:1)

将URL存储为数据库中的字符串并使用Image Loader显示它更容易,但不能脱机工作,如果你的应用程序需要互联网工作,图像加载器可能会更好。 android-loading-image-from-url-http

答案 1 :(得分:0)

我最终使用了这个库。

这不是一个理想的解决方案,因为我更喜欢浏览这个库,完全理解它并为可能需要类似答案的其他人解释它。但就目前而言,尝试做类似事情的人也应该能够使用它。

https://code.google.com/p/imagemanager/