Android – 从网站下载图片,保存到内部私人应用程序的内存,显示列表项

我想要做的是这样的:我想我的应用程序从互联网上下载一个图像,并将其保存到手机的内部存储器的应用程序私有位置。 如果没有图像可用于列表项目(即它不能在互联网上find),我想要一个默认的占位符图像显示。 这是我在list_item_row.xml文件中定义的默认图像。

在我的ListActivity文件中,我调用了一个我写的CustomCursorAdapter类的实例。 它在CustomCursorAdapter中遍历所有列表项,并定义需要将哪些内容映射到视图,包括通过尝试从内部内存读取图像文件。

我已经看到了这个问题上的几个问题,但这些例子要么是特定于外部手机内存(如SDCard),涉及保存string而不是图像,或涉及使用Bitmap.CompressFormat减less文件的分辨率(这是不必要的我的情况,因为这些图像将是小分辨率的小缩略图)。 试图拼凑每个例子中的代码一直是困难的,因此我问我的具体例子。

目前,我相信我已经写了有效的代码,但没有图像显示我的列表项目,包括默认的占位符图像。 我不知道这个问题是由无效的下载/保存代码,还是无效的读取代码造成的 – 这不利于我不知道如何检查内部存储器来查看图像是否存在。

无论如何,这是我的代码。 任何帮助将不胜感激。

    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; } } 

    Related of "Android – 从网站下载图片,保存到内部私人应用程序的内存,显示列表项"

    似乎有些代码被遗漏了,我把它重写成这样:

    ProductUtils.java

     public static String productLookup(String productID, Context c) throws IOException { URL url = new URL("http://www.samplewebsite.com/" + productID + ".jpg"); InputStream input = null; FileOutputStream output = null; try { String outputName = productID + "-thumbnail.jpg"; input = url.openConnection().getInputStream(); output = c.openFileOutput(outputName, Context.MODE_PRIVATE); int read; byte[] data = new byte[1024]; while ((read = input.read(data)) != -1) output.write(data, 0, read); return outputName; } finally { if (output != null) output.close(); if (input != null) input.close(); } } 

    看起来像试图读取图像文件名称时,只是简单地引用它是不够的,我不得不调用getFilesDir()来获取文件存储的path。 以下是我使用的代码:

     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); } } 
     void writeToFile(Bitmap _bitmapScaled) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); _bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes); try{ File f; //you can create a new file name "test.jpg" in sdcard folder. if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) f =new File(android.os.Environment.getExternalStorageDirectory(),"FamilyLocator/userimages/"+imageName); else f = new File(Environment.getDataDirectory(),"FamilyLocator/userimages/"+imageName); f.createNewFile(); //write the bytes in file FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); // remember close de FileOutput fo.close(); }catch(Exception e){e.printStackTrace();} }