Android 內(nèi)置應(yīng)用截屏方法

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)欄的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容