Androidで表示されているViewをファイル保存する

View view = findViewById(R.id.preview);
Bitmap bitmap = null;
OutputStream stream = null;
boolean result = false;
try {
    final String filename = "saved.jpg";
    final File saved = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename);
    final int quality = 100;
    stream = new FileOutputStream(saved);

    // 通常はCacheを使用したほうが処理は早い。
    final boolean isAutoScale = false;
    view.buildDrawingCache(isAutoScale);
    bitmap = view.getDrawingCache(isAutoScale);
    result = bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream);
    view.destroyDrawingCache();

    // 上のキャッシュを利用するやり方だと
    // ”View too large to fit into drawing cache, needs ~ bytes, only ~ available”
    // と出ることがある。其の場合は下記のやり方で。
    // ただし端末によっては処理が遅い。
    bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);

    Toast.makeText(getContext(), (result && saved.exists()) ? "Succeed." : "Failure.", Toast.LENGTH_SHORT).show();
} catch (Throwable throwable) {
    throwable.printStackTrace();
} finally {
    try {
        if (bitmap != null) {
            bitmap.recycle();
        }

        if (stream != null) {
            stream.close();
        }
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
}