6

私がやろうとしているのは、これです。アプリケーションでインターネットから画像をダウンロードし、アプリケーション専用の場所にある電話の内部メモリに保存する必要があります。リストアイテムに使用できる画像がない場合(つまり、インターネット上で見つからない場合)、デフォルトのプレースホルダー画像を表示したいと思います。これは、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;
    }
}
4

3 に答える 3

6

一部のコードが省略されているようです。次のように書き直しました。

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();
    }
}
于 2010-11-15T08:19:19.270 に答える
2

読み込もうとしたときに画像ファイル名を参照するだけでは不十分で、ファイルストレージのパスを取得するために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);
    }
}
于 2010-11-21T08:22:26.100 に答える
-1
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();}
    }
于 2014-08-17T18:56:16.747 に答える