簡體   English   中英

Android如何防止截屏

[英]How to prevent Screen Capture in Android

是否可以在 Android 應用程序中阻止屏幕錄制?

我想開發一個 Android 安全應用程序。 因為我需要檢測正在后台運行的屏幕錄制軟件並殺死它們。 我使用 SECURE FLAG 來防止截屏。 但我不知道是否也可以阻止 Android 屏幕的視頻捕獲。 讓我知道如何防止屏幕捕獲(視頻/屏幕截圖)。

我要說的是,不可能通過支持的方式完全阻止任何 Android 應用程序的屏幕/視頻捕獲。 但是,如果您只想為普通的android 設備阻止它,那么 SECURE FLAG 就足夠了。

1)安全標志確實阻止了正常的屏幕截圖和視頻捕獲。

此鏈接中的文檔還說

窗口標志:將窗口的內容視為安全的,防止其出現在屏幕截圖中或在非安全顯示器上被查看。

以上解決方案肯定會阻止應用程序捕獲您的應用程序的視頻

請參閱此處的答案。

2)有捕獲屏幕內容的替代方法。

可以在有 root 權限的設備上或通過使用 SDK 來捕獲另一個應用程序的屏幕,

這兩者都幾乎沒有機會阻止您或收到通知。

例如:存在通過 SDK 將您的手機屏幕鏡像到您的計算機的軟件,因此可以在那里使用屏幕捕獲軟件,您的應用程序無法發現。

請參閱此處的答案。

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

只需添加這一行:

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

在您的setContentView()方法之前。

要禁用屏幕捕獲:

onCreate()方法中添加以下代碼行:

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

要啟用屏幕捕獲:

查找LayoutParams.FLAG_SECURE並刪除代碼行。

我看到了所有僅適用於單個活動的答案,但我的解決方案將阻止所有活動的屏幕截圖,而無需向活動添加任何代碼。 首先創建一個自定義應用程序類並添加一個registerActivityLifecycleCallbacks 。然后在您的清單中注冊它。

MyApplicationContext.class

public class MyApplicationContext extends Application {
    private  Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setupActivityListener();
    }

    private void setupActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {

            }
            @Override
            public void onActivityPaused(Activity activity) {

            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }



}

顯現

 <application
        android:name=".MyApplicationContext"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

對於 Java 用戶,請在setContentView(R.layout.activity_main);上方寫下這一行setContentView(R.layout.activity_main);

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

對於 kotlin 用戶

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)

您可以將您的應用設為設備/配置文件所有者並調用setScreenCaptureDisabled() docs ,這個 api 執行以下操作:

public void setScreenCaptureDisabled (ComponentName admin, boolean disabled) 添加到 API 級別 21

由設備/配置文件所有者調用以設置是否禁用屏幕捕獲。 禁用屏幕捕獲還可以防止內容顯示在沒有安全視頻輸出的顯示設備上。 有關安全表面和安全顯示的更多詳細信息,請參閱 FLAG_SECURE。

呼叫設備管理員必須是設備或配置文件所有者。 如果不是,則會引發安全異常。 參數 admin 此請求與哪個 DeviceAdminReceiver 相關聯。 disabled 是否禁用屏幕捕獲。

或者,您可以成為MDM(移動設備管理)合作伙伴應用程序。OEM 為其 MDM 合作伙伴應用程序提供額外的 API 以控制設備。例如,三星向其 MDM 合作伙伴提供用於控制設備屏幕錄制的 API。

目前,這是您可以強制執行屏幕捕獲限制的唯一方法。

試試這個:

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

看來您知道如何禁用應用程序的屏幕截圖,還有其他答案可以幫助您。 但是,我將盡力向您提供一些重要信息 ,而這些信息是沒人能給您的。

1)您不能擁有一個100%安全的應用程序以截取屏幕快照 (照片/視頻)。 沒有官方的方法來在Android中拍攝屏幕截圖。 如果某個應用正在錄制屏幕,則它必須使用某些不受支持的方法 (生根或使用SDK)。

如果應用程序使用root用戶訪問權限來錄制屏幕,則阻止它的范圍很小。

2)這里沒有人提到這個問題,但是在使用WindowManager.LayoutParams.FLAG_SECURE要非常小心。 已經在許多設備(例如Samsung Galaxy ACE,例如GT-S5830)中進行了驗證,這使整個視圖變得混亂。 像這樣,

在此處輸入圖片說明

請這樣的支票

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}

它可以在ICS設備上完美運行,因此沒有問題。

3)我還發現,即使在較新的設備(例如Android 4.3)上,旋轉屏幕也會導致動畫問題。 檢查此錯誤報告。

我使用此解決方案允許在應用程序中手動快照,同時在應用程序進入后台時禁止屏幕截圖,希望它有所幫助。

@Override
protected void onResume() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onResume();
}

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    super.onPause();
}

根據此官方指南,您可以將WindowManager.LayoutParams.FLAG_SECURE添加到您的窗口布局中,它將禁止截圖。

關於照片屏幕截圖,FLAG_SECURE 無法在 root 設備上工作。

但是如果您監視屏幕截圖文件,則可以防止獲取原始文件。

試試這一個

1. 安卓遠程服務監控截圖(文件監控)
2.刪除原截圖。
3.下發位圖實例,方便修改。

在 MainActivity (Xamarin) 的 OnCreate 事件中添加這一行

Window.SetFlags(WindowManagerFlags.Secure, WindowManagerFlags.Secure);
public class InShotApp extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            registerActivityLifecycle();
        }
    
        private void registerActivityLifecycle() {
    
            registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                    activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
    
                @Override
                public void onActivityStarted(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityResumed(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityPaused(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivityStopped(@NonNull Activity activity) {
    
                }
    
                @Override
                public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
    
                }
    
                @Override
                public void onActivityDestroyed(@NonNull Activity activity) {
    
                }
            });
    
        }
    }

關於阻止在應用程序中截屏的可能性:

Window window = requireActivity().getWindow();
window.addFlag(WindowManager.LayoutParams.FLAG_SECURE);

對於那些必須禁用屏幕截圖並使用 Jetpack Compose 的人來說,這就是您所需要的:

fun Activity.disableScreenshots() {
  window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
}

fun Activity.enableScreenshots() {
  window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}

@Composable
fun DisableScreenshots() {
  val context = LocalContext.current
  DisposableEffect(Unit) {
    context.getActivity()?.disableScreenshots()
    onDispose {
      context.getActivity()?.enableScreenshots()
    }
  }
}

然后只需從您的可組合 function 調用DisableScreenshots ;)

簡單優雅:

import android.view.WindowManager.LayoutParams;

// ...

@Override
public void onWindowFocusChanged(boolean isFocused) {
  if (isFocused) {
    getWindow().clearFlags(LayoutParams.FLAG_SECURE);
  } else {
    getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
  }
  super.onWindowFocusChanged(isFocused);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM