Disable Android's Screenshot Feature

今天要來做一件無聊的事,就是將Android的螢幕截圖(Screenshot)功能關閉!前提是必須先成功下載Android原始碼並且編譯成功,因為我們要進入Android的軀幹進行改造,直接透過修改Framework來關閉螢幕截圖的功能。

思考邏輯
很簡單,就是將「執行螢幕截圖的方法」關閉,而螢幕截圖的功能需要被觸發才會動作,所以僅僅將其關閉應該不會牽扯到其他物件。

那麼如此龐大的原始碼,要如何尋找這個「執行螢幕截圖的方法」呢?這要慶幸Android是一群令人敬佩的軟體工程師設計出來的,每一個物件的命名都是有跡可循且簡單易懂,因此可以很快推測出跟使用畫面相關的功能應該會整合在SystemUI,翻開一看,裡面果然有一個資料夾的名稱就是Screenshot!

接著將screenshot目錄底下的TakeScreenshotService.java開啟
(frameworks/base/packages/SusyemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java)

將執行螢幕截圖的動作註解掉!

/*
mScreenshot.takeScreenshot(new Runnable()
{
  @Override public void run()
  {
    Message reply = Message.obtain(null, 1);
      try
    {
      callback.send(reply);
    }
    catch (RemoteException e)
    { }
  }
}, msg.arg1 > 0, msg.arg2 > 0);
*/


修改完成之後必須重新編譯原始碼

$ make update-api
$ make

此方法會將整個系統的螢幕截圖功能完全關閉,也就是說當使用者同時按住電源鍵和音量鍵下時,不會有任何動作了。

如果開發者僅需做到「應用程式執行時,禁止螢幕截圖」,那就得參考另一個方法。

參考網址:
Prevent other applications form capturing/recording screen

在要被禁止螢幕截圖的Activity裡面加上FLAG_SECURE

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

基本上兩個方法是完全不一樣的出發點不一樣的結果,一個是直接修改原始碼然後進行編譯,編譯完之後必須將手機重刷才算完成,一個是從應用程式出發,保護特定的應用程式。

留言

這個網誌中的熱門文章

程式語言常用之符號與詞彙 - 中英文對照

什麼是 Bootloader?

Repo 實用指令