Android – загрузка изображения из Интернета, сохранение во внутреннюю память в месте, закрытом для приложения, отображение для элемента списка

Я пытаюсь сделать следующее: я хочу, чтобы мое приложение загружало изображение из Интернета и сохраняло его во внутренней памяти телефона в месте, которое является приватным для приложения. Если для элемента списка нет изображения (т. Е. Его невозможно найти в Интернете), я хочу, чтобы отображалось изображение-заполнитель по умолчанию. Это изображение, которое я определил в моем файле list_item_row.xml как значение по умолчанию.

В моем файле ListActivity я вызываю экземпляр класса CustomCursorAdapter, который я написал. Он находится в CustomCursorAdapter, где я повторяю все элементы списка и определяю, какой контент должен быть сопоставлен с представлениями, включая файл изображения, пытаясь прочитать его из внутренней памяти.

Я видел несколько вопросов по этому вопросу, но примеры либо специфичны для внешней памяти телефона (например, SDCard), либо включают в себя сохранение строк вместо изображений, либо использование Bitmap.CompressFormat для уменьшения разрешения файла (что необязательно в Мой случай, так как эти изображения будут маленькими эскизами уже малого разрешения). Попытка скомпоновать код из каждого примера была трудной, поэтому я спрашивал о моем конкретном примере.

На данный момент, я считаю, что я написал правильный код, но изображение не отображается для моих элементов списка, включая образ заполнителя по умолчанию. Я не знаю, вызвана ли проблема недействительным кодом загрузки / сохранения или недопустимым кодом чтения – это не помогает, я не знаю, как проверить внутреннюю память, чтобы увидеть, существует ли изображение.

В любом случае, вот мой код. Любая помощь будет принята с благодарностью.

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

Solutions Collecting From Web 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 (), чтобы получить путь к файловому хранилищу. Ниже приведен код, который я использовал:

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