Android實現對當前界面截屏,並將截圖文件存放至本地文件夾
首先需要動態申請兩項權限(Android6.0後危險權限之類的都需要動態申請),在AndroidManifest.xml中靜態添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
其中<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>會報錯提示
Permission is only granted to system apps,解決方案:
點擊File—>Settings—>Editor—>Inspections—>搜索Using system app permission,將Error改爲Waring。
解決以後再Acrivity中動態申請該權限,調用以下代碼
private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } }
然後通過創建一個ScreenShot的工具類來進行管理和操作
package com.example.administrator.screenshot.util; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Rect; import android.os.Environment; import android.util.Log; import android.view.View; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class ScreenShot { // 獲取指定Activity的截屏,保存到png文件 static String newFilePath; private static Bitmap takeScreenShot(Activity activity) { // View是你需要截圖的View View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap b1 = view.getDrawingCache(); // 獲取狀態欄高度 Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; Log.i("TAG", "" + statusBarHeight); // 獲取屏幕長和高 int width = activity.getWindowManager().getDefaultDisplay().getWidth(); int height = activity.getWindowManager().getDefaultDisplay() .getHeight(); // 去掉標題欄 // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455); Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return b; } // 保存到sdcard private static void savePic(Bitmap b, String strFileName) { FileOutputStream fos = null; try { //判斷是否存在該文件夾和文件,如果沒有新建 File file = new File(strFileName); //獲取父目錄 File fileParent = file.getParentFile(); //判斷是否存在 if (!fileParent.exists()) { // 創建父目錄文件 fileParent.mkdirs(); } file.createNewFile(); fos = new FileOutputStream(new File(strFileName)); if (null != fos) { b.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //用於獲取當前最新的截圖 public static String getPath(){ return newFilePath; } // 截屏方法 public static void shoot(Activity a) { Date date = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String fileName = df.format(date)+".png"; String sdCardPath = Environment.getExternalStorageDirectory().getPath(); String filePath = sdCardPath + File.separator + "xinlv" + File.separator + "Screenshoots"+ File.separator + fileName; newFilePath = filePath; ScreenShot.savePic(ScreenShot.takeScreenShot(a), filePath); } }
做了一個小Demo實現了本功能,Demo地址https://github.com/18855578562/ScreenShot