天天看點

Android 擷取目前Activity螢幕截圖以及儲存到本地

廢話多說,直接上代碼:

這種方法,直接去掉了标題欄,是整個activity的圖像。

在AndroidManifest.xml裡先增加讀寫權限,版本高的話另外在代碼裡去請求

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
      

擷取目前螢幕截圖,并傳回bitmap:

public static Bitmap activityShot(Activity activity) {
    /*擷取windows中最頂層的view*/
    View view = activity.getWindow().getDecorView();

    //允許目前視窗儲存緩存資訊
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();

    //擷取狀态欄高度
    Rect rect = new Rect();
    view.getWindowVisibleDisplayFrame(rect);
    int statusBarHeight = rect.top;

    WindowManager windowManager = activity.getWindowManager();

    //擷取螢幕寬和高
    DisplayMetrics outMetrics = new DisplayMetrics();
    windowManager.getDefaultDisplay().getMetrics(outMetrics);
    int width = outMetrics.widthPixels;
    int height = outMetrics.heightPixels;

    //去掉狀态欄
    Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarHeight, width,
            height - statusBarHeight);

    //銷毀緩存資訊
    view.destroyDrawingCache();
    view.setDrawingCacheEnabled(false);

    return bitmap;
}
      

然後根據上面方法傳回的bitmap,儲存到本地檔案夾,提供了兩種方法。

1.

public void saveBitmap(Bitmap bitmap) {
    // 首先儲存圖檔
    File appDir = new File(Environment.getExternalStorageDirectory(), "image");
    if (!appDir.exists()) {
        appDir.mkdir();
    }
    String fileName = "image" + ".png";
    File file = new File(appDir, fileName);
    try {
        FileOutputStream fos = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 把檔案插入到系統圖庫
    try {
        MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), fileName, null);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    // 通知圖庫更新
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + "/sdcard/namecard/")));
}      

2.

public static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/abc/pics";

public static void saveBitmapToLocal(String fileName, Bitmap bitmap) {
    try {
        // 建立檔案流,指向該路徑,檔案名叫做fileName
        File file = new File(FILE_PATH, fileName+".png");
        // file其實是圖檔,它的父級File是檔案夾,判斷一下檔案夾是否存在,如果不存在,建立檔案夾
        File fileParent = file.getParentFile();
        if (!fileParent.exists()) {
            // 檔案夾不存在
            fileParent.mkdirs();// 建立檔案夾
        }
        // 将圖檔儲存到本地
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100,
                new FileOutputStream(file));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
      

補充說明,第一種方法更新了手機自帶的圖庫,調用完方法可以去圖庫進行檢視。