Android - загрузка изображения из Интернета, сохранение во внутренней памяти в месте, приватном для приложения, отображение элемента списка - PullRequest
7 голосов
/ 15 ноября 2010

Я пытаюсь сделать следующее: я хочу, чтобы мое приложение загружало изображение из Интернета и сохраняло его во внутренней памяти телефона в месте, которое является частным для приложения.Если для элемента списка нет изображения (то есть его нельзя найти в Интернете), я хочу, чтобы отображалось изображение заполнителя по умолчанию.Это изображение, которое я определил в своем файле 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;
    }
}

Ответы [ 3 ]

7 голосов
/ 15 ноября 2010

кажется, что какой-то код пропущен, я переписал это так:

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();
    }
}
2 голосов
/ 21 ноября 2010

Похоже, простой ссылки на имя файла изображения при попытке прочитать его было недостаточно, и мне пришлось вызвать 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);
    }
}
0 голосов
/ 17 августа 2014
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();}
    }
...