0

私はインターネットから(以下の方法で)画像を取得し、いくつかのキャンバス作業を行おうとしています。しかし時々私はoutOfMemory例外を持っています。だから私はinputStreamを内部メモリの代わりにメモリカードに直接ロードする方法があるかどうか疑問に思っています。

private Bitmap LoadImageFromWebOperations(String url)
{   

   try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        bitmap = ((BitmapDrawable)d).getBitmap().copy(Config.ARGB_8888, true);
        return bitmap;
        }catch (Exception e) {
        System.out.println("Exc="+e);
        return null;
    }
}

logcatは、例外はその行が原因であると言っています:

Drawable d = Drawable.createFromStream(is, "src name");

事前にThx!

4

1 に答える 1

1

このコードは、Fedor Vlasov の lazylist demo: Lazy load of images in ListViewから取得しました。

まず、入力ストリームをファイル出力ストリームにコピーする関数を作成する必要があります。

public static void CopyStream(InputStream is, OutputStream os)
{
    final int buffer_size=1024;
    try
    {
        byte[] bytes=new byte[buffer_size];
        for(;;)
        {
          int count=is.read(bytes, 0, buffer_size);
          if(count==-1)
              break;
          os.write(bytes, 0, count);
        }
    }
    catch(Exception ex){}
}

次に、キャッシュ フォルダーを取得します。

if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
        cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCacheDir");
    else
        cacheDir=context.getCacheDir();
    if(!cacheDir.exists())
        cacheDir.mkdirs();

次に、ビットマップをロードします。

 private Drawable getBitmap(String url) 
{
    String filename=URLEncoder.encode(url);
    File f= new File(cacheDir, filename);

    try {                        
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        InputStream is = conn.getInputStream();
        OutputStream os = new FileOutputStream(f);
        CopyStream(is, os);
        os.close();            

        Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(f));            
        return new BitmapDrawable(bitmap);
    } catch (Exception ex){
       ex.printStackTrace();
       return null;
    }
} 
于 2012-07-05T09:34:52.770 に答える