android截圖功能實現
阿新 • • 發佈:2019-01-08
這篇文章實現了擷取當前Activity頁面,並把截圖圖片儲存在SD卡指定路徑下功能(親測可用)。
首先要確保manifest有操作SD卡許可權
<!-- 允許應用內建sd卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
下面方法是根據當前的activity截圖,生成bitmap物件
/** * 獲取指定Activity的截圖,儲存到png檔案 * * @author Johnson * **/ private static Bitmap takeScreenShot(Activity activity) { // View是你需要截圖的View View view = activity.getWindow().getDecorView(); // 設定是否可以進行繪圖快取 view.setDrawingCacheEnabled(true); // 如果繪圖快取無法,強制構建繪圖快取 view.buildDrawingCache(); // 返回這個快取檢視 Bitmap bitmap = view.getDrawingCache(); // 獲取狀態列高度 Rect frame = new Rect(); // 測量螢幕寬和高 view.getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; Log.d("ViewDescActivity","狀態列的高度為: "+statusBarHeight); // 獲取螢幕長和高 int width = activity.getWindowManager().getDefaultDisplay().getWidth(); int height = activity.getWindowManager().getDefaultDisplay().getHeight(); // 去掉標題欄 // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455); bitmap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width, height-statusBarHeight); //view.destroyDrawingCache(); return bitmap; }
然後我們應該檢視SD卡是不是夠用
/*** * Sd判斷SD卡是否可用 * * @author Johnson minSizeSDcard>50kb * */ public static boolean getAvailableSDcard(Context context) { long minSizeSDcard = 50; boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); // 判斷sd卡是否存在 System.out.println("+++" + sdCardExist); if (sdCardExist) { File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); long sdCardSize = (availableBlocks * blockSize) / 1024;// KB值 if (sdCardSize > minSizeSDcard) { return true; } else { Toast.makeText(context, "SD卡空間不足", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(context, "請插入SD卡", Toast.LENGTH_SHORT) .show(); } return false; }
最後生成png圖片儲存到指定路徑
/** * 截圖儲存 * * @author Johnson * **/ private static void savePic(Bitmap b, String filePath, String fileName) { File f = new File(filePath); if (!f.exists()) { f.mkdir(); } FileOutputStream fos = null; try { fos = new FileOutputStream(filePath + File.separator + fileName); if (null != fos) { b.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
可以這樣呼叫
Bitmap bitmap = takeScreenShot(ViewDescActivity.this);
String fileName = String.valueOf(System.currentTimeMillis());
if(getAvailableSDcard(ViewDescActivity.this)){
savePic(bitmap,Constant.SD_DIR_SCREEN_SHOT,fileName+".png");
localUrl = Constant.SD_DIR_SCREEN_SHOT+ fileName+".PNG";
}
開始忘記加允許應用內建sd卡許可權,系統報錯:
01-06 23:32:40.203: ERROR/ActivityThread(1954): Failed to find provider info for com.qihoo360.daemon
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track delete
01-06 23:32:43.148: ERROR/AudioTrack(1632): stop 0x528b88
01-06 23:32:43.148: ERROR/AudioTrack(1632): Stop complete
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit start
01-06 23:32:43.148: ERROR/AudioTrack(1632): Audio track exit done
01-06 23:32:43.335: ERROR/AudioTrack(1632): stop 0x545d70
01-06 23:32:43.335: ERROR/AudioTrack(1632): Stop complete
然後忘記在fileName後面加“.png” 後果就是生成非圖片檔案。
提醒自己以後不要這麼粗心了。