アプリ内で表示されているViewそのものを画像として保存する


アプリ内で表示されているViewを、画像として保存したいと思ったことはありませんか?
動的なViewを、そのまま画像としてSDカードに保存する方法は、このようになります。

[MainActivity]

//合成したViewからBitmapを取得
save_view.setDrawingCacheEnabled(true);
save_view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
save_view.layout(0, 0, save_view.getMeasuredWidth(), save_view.getMeasuredHeight()); 
save_view.buildDrawingCache(true);
Bitmap newBitmap = Bitmap.createBitmap(save_view.getDrawingCache());
save_view.setDrawingCacheEnabled(false); //キャッシュをクリアー

//nullだったらリターン
if (newBitmap == null) {
	return;
}

//Uri・ファイル名を取得
Uri mUri = ComnUtil.getSimulationUri(MainActivity.this);
//保存
Cursor c = getContentResolver().query(mUri, null, null, null, null);
c.moveToFirst();
String filename = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DATA));

OutputStream outputStream = null;
try {
    outputStream = getContentResolver().openOutputStream(mUri);
    newBitmap.compress(CompressFormat.JPEG, 100, outputStream);
} catch (FileNotFoundException e) {
} finally {
    if (outputStream != null) {
        try {
            outputStream.close();
        } catch (IOException e) {
			return;
        }
    }
}

//ここまできたら正常に成功しているのでダイアログを出してあげると親切かも
String menu_text = res.getString(R.string.check_exp, filename);
new AlertDialog.Builder(MainActivity.this)
.setMessage(menu_text)
.setPositiveButton(R.string.common_ok,null)
.show();

[ComnUtil]

public static Uri getSimulationUri(Context context) {
	long currentTimeMillis = System.currentTimeMillis();
	Date today = new Date(currentTimeMillis);
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
	String title = dateFormat.format(today);
	String dirPath = getDirPath(context);
	String fileName = "Simulation" + title + ".jpg";	//ご自由にお名前をつけてください
	String path = dirPath + fileName;
	File file = new File(path);
	ContentValues values = new ContentValues();
	values.put(Images.Media.TITLE, title);
	values.put(Images.Media.DISPLAY_NAME, fileName);
	values.put(Images.Media.MIME_TYPE, "image/jpeg");
	values.put(Images.Media.DATA, path);
	values.put(Images.Media.DATE_TAKEN, currentTimeMillis);
	if (file.exists()) {
		values.put(Images.Media.SIZE, file.length());
	}
	Uri uri = context.getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values);
	return uri;
}

[strings.xml]

<string name="common_ok">OK</string>
<string name="check_exp">画像を\n%1$s\nに保存しました</string>

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください