1. 程式人生 > >Android 應用內某些頁面禁止截圖與截圖工具類

Android 應用內某些頁面禁止截圖與截圖工具類

1.禁止截圖的實現

APP的某些介面如果不希望使用者能夠截圖,可以對當前當前的Activity設定一個安全標記

實際上,Android 本身就提供了對應的 Api 的,使用起來也非常的簡單,只需要拿到 window 物件,對其新增一個 FLAG_SECURE 的 flag 即可。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

這裡的 window 物件,可以是 Activity.getWindow() 獲取的,也可以是 Dialog.getWindow() 獲取的,獲取 window 的方式很多,這裡就不一一舉例了。只是使用不同物件獲取到的 Window 物件,禁用截圖的區域也不同。

大部分情況下都推薦使用這種方法,禁用掉系統截圖的功能,一勞永逸。

這裡寫圖片描述

FLAG_SECURE 是 WindowManager.LayoutParams 的一個屬性,從文件上就可以看出來,它標記當前 window 是安全的,不允許有一些非安全的操作,例如截圖功能。

在Google的過程中, 發現這個flag可以實現以下功能:
1.阻止螢幕截圖
2.在Recent apps(任務切換介面)中只顯示應用名字和圖示, 不顯示內容
3.Google App的Now on tap功能不會去分析你的頁面的內容

2.截圖的實現

截圖工具類ScreenUtils

import
android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Rect; import android.util.DisplayMetrics; import android.view.View; import android.view.WindowManager; public class ScreenUtils { private ScreenUtils() { /* cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated"); } /** * 獲得螢幕高度 * * @param context * @return */ public static int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.widthPixels; } /** * 獲得螢幕寬度 * * @param context * @return */ public static int getScreenHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.heightPixels; } /** * 獲得狀態列的高度 * * @param context * @return */ public static int getStatusHeight(Context context) { int statusHeight = -1; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height").get(object).toString()); statusHeight = context.getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } return statusHeight; } /** * 獲取當前螢幕截圖,包含狀態列 * * @param activity * @return */ public static Bitmap snapShotWithStatusBar(Activity activity) { View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bmp = view.getDrawingCache(); int width = getScreenWidth(activity); int height = getScreenHeight(activity); Bitmap bp = null; bp = Bitmap.createBitmap(bmp, 0, 0, width, height); view.destroyDrawingCache(); return bp; } /** * 獲取當前螢幕截圖,不包含狀態列 * * @param activity * @return */ public static Bitmap snapShotWithoutStatusBar(Activity activity) { View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bmp = view.getDrawingCache(); Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; int width = getScreenWidth(activity); int height = getScreenHeight(activity); Bitmap bp = null; bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight); view.destroyDrawingCache(); return bp; } }

通過呼叫以上工具類的截圖方法就可以拿到圖片的bitmap。

相關推薦

Android 應用某些頁面禁止工具

1.禁止截圖的實現 APP的某些介面如果不希望使用者能夠截圖,可以對當前當前的Activity設定一個安全標記 實際上,Android 本身就提供了對應的 Api 的,使用起來也非常的簡單,只需要拿到 window 物件,對其新增一個 FLAG_SECURE

android 應用懸浮框,並在指定頁面顯示

一、實現懸浮 懸浮框基本的實現方式有兩種: 1、 在一個頁面內,可以用FrameLayout 或者RelativeLayout。FrameLayout 中view是在左上角堆疊的,也就是說是z-order的,所以可以頁面的基佈局是FrameLayout,然

Android應用展示word、excel、pdf、ppt等檔案

筆者最近兩個專案裡頭都有需要展示檔案的功能,於是做了一番調研,發現asce1885給出一份方案,不過都是關於pdf的展示:http://www.jianshu.com/p/1bf49af6584d,顯然不符合筆者的要求,筆者的專案裡需要展示的檔案格式並不單一,後來經過一番搜尋最後敲定使用

Android 應用資料傳遞

Android開發過程中,經常遇到APP內部(例如不同頁面間)資料傳遞的問題,簡單整理記錄這些資料傳輸的方式。貼上上程式碼,方便以後複製貼上。 一 SharePrefences 其實,把SharePrefence放到這裡不合適。SharePrefence是用來儲存少量資料

Google Android應用支付訂單服務端驗證

       最近公司的APP新增了收費版本,針對一些高階功能需要使用者付費才能使用,付費的方式是使用者通過應用內支付去訂閱一個月或一年的賬戶高階許可權,相當於QQ裡面的VIP功能。        大概的流程是使用者下載APP後註冊之後預設為普通使用者,使用者通過應用內支付

Android應用設定多語言,可隨系統語言改變而改變,也可設定app為固定語言不受系統語言影響

轉載請標明出處: https://blog.csdn.net/m0_38074457/article/details/84993366,本文出自:【陳少華的部落格】 一、效果圖 https://github.com/hnsycsxhzcsh/MultiLanguage/blob/mas

Android 應用跳轉QQ客服的工具

工具類如下: public class QQUtil { public static void toQQServer(Context context){ try { ApplicationInfo info = context.getPackage

android 應用通知,仿通知欄通知效果,通知Toast,懸浮窗

    開發應用,有時候需要在應用內通知提示,如果涉及內部通知提示過多,就需要考慮展示問題,而且還有需要考慮,內部通知提示,不能影響使用者的操作行為,以及切換介面的時候(Activity切換)通知提示還得存在一定時間後消失或者不消失,結合這些問題,自己嘗試去搞搞

Android應用呼叫百度,高德,谷歌地圖導航

最近專案中有個呼叫百度地圖導航的需求,雖然網上一找一堆,還是覺得自己記錄一下比較方便。1.百度導航//開啟百度導航 public void startNavi() { //百度地圖,從起點是La

android應用升級踩到的一個大坑

app做了應用內升級。適配到8.0,自己測試完全沒問題,然後在第三版上線後,發現第二版本的應用內升級出問題了!!!最後問題如下:1、第二版本的app大小6.5mb(未做混淆)                        2、第三版本app大小5.9mb(做了混淆)     

Android應用開啟高德、百度、騰訊地圖app

     最近在專案中需要地圖導航功能,但是匯入第三方地圖導航包的話,應用打出包後會很大,所以考慮到可以通過呼叫外部地圖應用來解決,參考了微信開啟外部地圖的做法,有了下面的解決辦法:1.主要思路:通過高德、百度、騰訊提供的Uri開啟應用外部地圖app.2.關鍵程式碼(以高德地

關於Android應用安裝app然後開啟其他app的一些記錄(相容至Android O)

        前段時間個人專案裡需要加入一個預覽word文件的功能,大致流程就是把這個word下載下來,然後用Tencent的X5核心開啟。很簡單對吧,可是讓人頭疼的是將這個功能整合至專案後,一直提示預覽失敗。然而我自己單獨寫的集成了X5核心的demo確是完美開啟,很無語。

一種 Android 應用全域性獲取 Context 例項的裝置

哥白尼 · 羅斯福 · 馬丁路德 · 李開復 · 嫁衣曾經說過Where there is an Android App, there is an Application context.沒毛病,扎心了。App 執行的時候,肯定是存在至少一個 Application 例項的。同時,Context 我們再熟悉不

Android應用多程序的使用

Android應用內多程序介紹及使用   一個應用預設只有一個程序,這個程序(主程序)的名稱就是應用的包名,程序是系統分配資源和排程的基本單位,每個程序都有自己獨立的資源和記憶體空間,其它程序不能任意訪問當前程序的記憶體和資源,系統給每個程序分配的記憶體會有限制。  

Android 應用懸浮控制元件實踐總結

2017/12/30 更新: FloatWindow 庫已儘量去適配各國產機型,如果你想幫助此庫,評論告訴我列表中沒有的機型,尤其是適配出現問題的機型,謝謝,以下為目前測試通過的機型: 8.0: 一加 三代 華為 Mate9Pro 小米 6

功能的實現

Demo在GitHub的地址: https://github.com/Hebin320/ScreenShoot Demo在CSDN上的下載地址: http://download.csdn.net/detail/hebin320320/9721970 在Andro

矩形ROI,實時顯示滑鼠的座標值,顯示原C++程式

 //main.cpp檔案 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <stdio.h> using name

Android應用層View繪製流程之DecorViewViewRootImpl

概述 一直對Android中View的整個繪製流程不是很瞭解,View是怎麼新增到Activity當中去的?當View中的內容發生改變的時候是怎樣執行介面的重新整理的?因此,今天準備從原始碼的角度來對View的整個繪製流程來進行分析,原始碼基於API25。由於

速達的用例時序

速達軟件 部分 訂單 軟件 log 技術 1-1 mage width 上圖這是我們速達軟件用戶之間的關系做出的用例圖,它們的關系就是註冊登錄選擇菜單,並且分為完成訂單和未完成兩部分進行。為完成就是結算,以完成就是終結。 這個是時序圖,它的構成基本就是整個軟件互相之間

時序狀態(Rose) - Windows XP經典軟件系列

blog data- windows 功能 clas text 協作圖 mar content 以CAN轉UART(串口)為例。 功能簡單介紹: 當主程序收到CAN口的數據後;依據按鍵的不同來選擇是使用C