画像の保存→表示

画像の保存と、画像ファイルの表示を実装しました。

まず、画像ファイルの保存

// SDカードのフォルダパス
// Environment.getExternalStorageDirectory().getPath()でSDカードのルートを取得できる
static final String SD_FILEPATH = "Environment.getExternalStorageDirectory().getPath() + "/AndTwitter/"

// URLからファイル名取得
// 正規表現でファイル名以前を排除
Pattern pattern = Pattern.compile("^http://.+/");
Matcher matcher = pattern.matcher("http://hoge/hoge/hoge.jpg");
String fileName = matcher.replaceAll("");
								
// 画像ファイルが存在しない場合、保存する
String filePath = SD_FILEPATH + fileName;
File imageFile = new File(filePath);
if(!imageFile.exists()){
	URL imageUrl = new URL(text);			        		
	InputStream imageIs = imageUrl.openStream();
	OutputStream imageOs = new FileOutputStream(filePath);
									
	try{
		byte[] buf = new byte[1024];
		int len = 0;
										
		while((len = imageIs.read(buf)) > 0){
			imageOs.write(buf, 0, len);
		}
										
		imageOs.flush();
	}finally{
		imageIs.close();
		imageOs.close();
	}
}

// データベースにファイル名保存
mCv.put(PROFILE_IMAGE_URL, fileName);

ファイル名をデータベースに格納しておいて、表示するときにそのファイル名でアクセスします。

で、これが表示。前エントリのMyViewBinderのcase文です。

case PROFILE_IMAGE_URL_ID:
	File imageFile = new File(SD_FILEPATH + cursor.getString(columnIndex));
	FileInputStream imageFis = new FileInputStream(imageFile);
	Bitmap bm = BitmapFactory.decodeStream(imageFis);
	((ImageView)view).setImageBitmap(bm);
	break;

調べた限りではImageViewに画像ファイルパスを設定して表示できるようなクラスはなかったので
・動的にリソース登録してImageViewにリソースを貼る
・ファイルからビットマップを生成してImageViewに貼る
の2択になったので、後者を選択。

どっちにしてもビットマップなのに、スクロールがなんかスムーズになったな・・・と思ったけど、前回確認したときはデバッグモードだったのかもしれない。

さて、次は"*分前 from AndTwitter"とか表示させるようにしたいので、日付、時間の扱いだな。それが終わったら・・・

そろそろつぶやけるようにしないとマズイよね(笑)