Android - 从网络下载图像,保存到应用程序私有位置的内部存储器,显示列表项
我正在尝试做的是:我希望我的应用程序从 Internet 下载图像并将其保存到手机的内部存储器中的应用程序专用位置.如果列表项没有可用的图像(即在 Internet 上找不到),我希望显示默认占位符图像.这是我在 list_item_row.xml 文件中定义的默认图像.
What I'm trying to do is this: I want my application to download an image from the Internet and save it to the phone's internal memory in a location that is private to the application. If there is no image available for the list item (i.e. it can't be found on the Internet), I want a default placeholder image to display. This is the image that I have defined in my list_item_row.xml file as the default.
在我的 ListActivity 文件中,我正在调用我编写的 CustomCursorAdapter 类的一个实例.它在 CustomCursorAdapter 中,我正在遍历所有列表项并定义需要映射到视图的内容,包括通过尝试从内部存储器读取图像文件.
In my ListActivity file, I am calling an instance of a CustomCursorAdapter class I have written. It is in CustomCursorAdapter where I am iterating through all the list items and defining what content needs to be mapped to the views, including the image file by trying to read it from internal memory.
我已经看到了关于这个主题的几个问题,但这些示例要么特定于外部手机内存(例如 SDCard),要么涉及保存字符串而不是图像,要么涉及使用 Bitmap.CompressFormat 来降低文件的分辨率(这在我的情况下是不必要的,因为这些图像将是已经很小分辨率的小缩略图).尝试将每个示例中的代码拼凑起来很困难,因此我询问了我的具体示例.
I've seen several questions on this subject, but the examples either are specific to external phone memory (e.g. SDCard), involve saving strings instead of images, or involve using Bitmap.CompressFormat to reduce the resolution of the file (which is unnecessary in my case, as these images will be small thumbnails of already-small resolution). Trying to piece together code from each example has been difficult, hence my asking about my specific example.
目前,我相信我已经编写了有效的代码,但没有为我的列表项显示任何图像,包括默认占位符图像.我不知道问题是由无效的下载/保存代码还是无效的读取代码引起的 - 我不知道如何检查内存以查看图像是否存在,这无济于事.
At the moment, I believe I've written valid code, but no image is displaying for my list items, including the default placeholder image. I don't know if the problem is being caused by invalid download/save code, or invalid read code - it doesn't help that I don't know how to check internal memory to see if the image exists.
无论如何,这是我的代码.任何帮助将不胜感激.
Anyways, here's my code. Any help would be greatly appreciated.
ProductUtils.java
public static String productLookup(String productID, Context c) throws IOException {
URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg");
URLConnection connection = url.openConnection();
InputStream input = connection.getInputStream();
FileOutputStream output =
c.openFileOutput(productID + "-thumbnail.jpg", Context.MODE_PRIVATE);
byte[] data = new byte[1024];
output.write(data);
output.flush();
output.close();
input.close();
}
CustomCursorAdapter.java
public class CustomCursorAdapter extends CursorAdapter {
public CustomCursorAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ImageView thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
String fileName =
cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_IMAGE_FILE_PATH));
Bitmap bMap = BitmapFactory.decodeFile(fileName);
thumbnail.setImageBitmap(bMap);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.list_item_row, parent, false);
bindView(v, context, cursor);
return v;
}
}
推荐答案
看起来只是读取图片文件名是不够的,还得调用getFilesDir()来获取文件的路径贮存.下面是我使用的代码:
Looks like simply referring to the image file name when trying to read it was not enough, and I had to call getFilesDir() to get the path of the file storage. Below is the code I used:
String path = context.getFilesDir().toString();
String fileName = cursor.getString(cursor.getColumnIndex(DbAdapter.KEY_PRODUCT_ID));
if (fileName != null && !fileName.equals("")) {
Bitmap bMap = BitmapFactory.decodeFile(path + "/" + fileName);
if (bMap != null) {
thumbnail.setImageBitmap(bMap);
}
}
相关文章