Android 中,內(nèi)置應(yīng)用如何更好的截屏
在開(kāi)發(fā)系統(tǒng)應(yīng)用的時(shí)候,有時(shí)候需要用到截屏,因?yàn)?View.getDrawingCache() 截不到狀態(tài)欄,所以這個(gè)方案不理想
這有一個(gè)更好的方案,就是用 SurfaceControl.screenshot() / Surface.screenshot() 截屏,在 API Level 大于 17 使用 SurfaceControl ,小于等于 17 使用 Surface ,但是這個(gè)方案有諸多限制,比如
1、需要反射調(diào)用,低版本中,Surface.screenshot() 函數(shù)是 hide 的,高版本中,SurfaceControl 類(lèi)是 hide 的
2、調(diào)用 screenshot() 函數(shù)需要權(quán)限
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
3、上面需要的權(quán)限,只對(duì)應(yīng)用簽名與 platform 簽名一致的應(yīng)用起作用
所以,非系統(tǒng)應(yīng)用是不能用的,即使調(diào)用了也會(huì)返回 null ,這個(gè)是一個(gè)對(duì)于系統(tǒng)應(yīng)用非常合適的截圖方案,具體代碼如下
public Bitmap screenshot() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
// 這里只是把兩個(gè)類(lèi)的寫(xiě)法寫(xiě)在一起
// 在系統(tǒng)中,系統(tǒng)版本是確定的,所以選其中一個(gè)
if (Build.VERSION.SDK_INT <= 17) {
return Surface.screenshot(metrics.widthPixels, metrics.heightPixels);
} else {
return SurfaceControl.screenshot(metrics.widthPixels, metrics.heightPixels);
}
}
當(dāng)然還需要在 AndroidManifest.xml 中加入上面說(shuō)的權(quán)限,否則截屏?xí)〉?br> 注意,我這里為什么沒(méi)有用反射,因?yàn)椋瑯?biāo)題里說(shuō)了,是 Android 內(nèi)置應(yīng)用,就是跟隨系統(tǒng)一起編譯的,所以是可以直接調(diào)用隱藏 api 的,用這個(gè)方案截的圖是包含狀態(tài)欄的