Androidで画面キャプチャを防止する方法


118

Androidアプリで画面記録を防ぐことはできますか?

Android Secure Applicationを開発したいのですが。その中で、バックグラウンドで実行されている画面記録ソフトウェアを検出して殺す必要があります。スクリーンショットを防ぐためにSECURE FLAGを使用しました。しかし、Android画面のビデオキャプチャを防止することも可能かどうかはわかりません。画面キャプチャ(ビデオ/スクリーンショット)を防ぐ方法を教えてください。


8
-コンテンツを盗むためにいつでも画面にカメラを向けることができることを覚えておく必要があります-DRMフィールドで使用されるいくつかのテクニックがありますが、それらはかなり複雑であり、
内部

9
@ShaiLevyが説明する概念は、通常、アナログホールen.wikipedia.org/wiki/Analog_holeと呼ばれ、メディア送信の必然的なセキュリティホールを説明します。
2015

回答:


126

サポートされている方法では、Androidアプリの画面/ビデオのキャプチャを完全に防止することは不可能です。ただし、通常の Androidデバイスでのみブロックする場合は、SECURE FLAGが重要です。

1)セキュアフラグは、通常のスクリーンショットとビデオキャプチャの両方をブロックします。

また、このリンクのドキュメントには、

ウィンドウフラグ:ウィンドウのコンテンツを安全なものとして扱い、スクリーンショットに表示されないようにするか、安全でないディスプレイで表示されないようにします。

上記のソリューションは確実にアプリケーションがあなたのアプリのビデオをキャプチャするのを防ぎます

ここで答えを見てください

2)画面コンテンツをキャプチャする別の方法があります。

ルート権限を取得されたデバイスで、またはSDKを使用して、別のアプリの画面をキャプチャできる場合があります。

どちらも、それをブロックしたり、通知を受け取ったりする可能性はほとんどありません。

例:SDKを介して携帯電話の画面をコンピューターにミラーリングするソフトウェアが存在するため、アプリで検出できない画面キャプチャソフトウェアをそこで使用できます。

ここで答えを見てください

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

11
または、ハンドヘルドカメラで画像をクリックするだけです。
Ravinder Payal 2016

68

この行を追加してください:

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

setContentView()メソッドの前。


11
質問:[quote]私はSECURE FLAGを使用しました[unquote]あなたの「答え」:[quote] FLAG_SECUREを使用できます[unqote]ここで問題を見つけられますか?
2Dee、2015

こんにちは、私はWebベースのポータルアプリケーションを開発しています。ユーザーは、あらゆる種類のブラウザを使用してこのポータルにアクセスできます。このポータルのユーザーは、モバイルデバイスを使用しているときにスクリーンショットを撮らないでください。Webアプリケーションに同じ予防策(etWindow()。setFlags(LayoutParams.FLAG_SECURE、LayoutParams.FLAG_SECURE);)を使用できますか?IOSで動作しますか?同じタイプの予防策を使用できる場合、この行をどこに呼べばよいですか?
Ferda-Ozdemir-Sonmez 2017

24

画面キャプチャを無効にするには:

onCreate()メソッドに次のコード行を追加します。

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

画面キャプチャを有効にするには:

LayoutParams.FLAG_SECUREコード行を見つけて削除します。


12

Javaユーザーの場合、この行を 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)

kotlinの場合、コンテキストによっては、Dialogsでwindow?.set...Windowを作成するかどうかわからないためです。
マルタンマルコンチーニ

1
元の質問ではすでにセキュアフラグを使用していると述べていましたが、答えはセキュアフラグを使用することです。これは投稿された質問には実際には答えません。
田代スバル

10

あなたはあなたのアプリからスクリーンショットを無効にする方法を知っているようで、それに役立つ他の答えがあります。しかし、私はあなたが誰もあなたを与えていないいくつかの重要な情報をあなたに与えるように努めます。

1)スクリーンショット(写真/ビデオ)の取得から100%安全なアプリを作成することはできません。Androidでスクリーンショットを撮る公式の方法はありません。アプリが画面を記録している場合、サポートされていない方法を使用している必要があります(ルート化またはSDKを使用)。

ルートアクセスを使用して画面を記録している場合、アプリをブロックする範囲はほとんどありません。

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などの新しいデバイスでも、画面を回転させるとアニメーションの問題が発生することがわかりました。このバグレポートを確認してください。


28
投票のために他の人の回答をコピーして貼り付けるだけではいけません。また、回答をコピーした場所への参照も追加します。stackoverflow.com/a/11121897/5437621
mrid

あなたの答えはコピーアンドペーストです。誰かの答えをコピーアンドペーストしないでください。以下のリンクのリンクからこの回答をコピーしてください。 stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi

9

アプリをデバイスまたはプロファイルの所有者にして、に電話をかけることができますsetScreenCaptureDisabled()docsから 、このAPIは次のことを行います。

public void setScreenCaptureDisabled(ComponentName admin、boolean disabled)APIレベル21で追加されました

画面キャプチャを無効にするかどうかを設定するためにデバイス/プロファイルの所有者によって呼び出されます。画面キャプチャを無効にすると、安全なビデオ出力を備えていないディスプレイデバイスにコンテンツが表示されなくなります。安全な表面と安全なディスプレイの詳細については、FLAG_SECUREを参照してください。

発信側のデバイス管理者は、デバイスまたはプロファイルの所有者である必要があります。そうでない場合、セキュリティ例外がスローされます。パラメータadminこのリクエストが関連付けられているDeviceAdminReceiver。画面キャプチャが無効になっているかどうか。

または、MDM(モバイルデバイス管理)パートナーアプリになることもできます。OEMは、デバイスを制御するためにMDMパートナーアプリに追加のAPIを提供します。

現在、これが画面キャプチャの制限を適用できる唯一の方法です。


9

これを試して:

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

3
質問:[quote]私はSECURE FLAGを使用しました[unquote]あなたの「答え」:[quote] FLAG_SECUREを使用できます[unqote]ここで問題を見つけられますか?
2Dee、2015

ウィンドウフラグ:ウィンドウのコンテンツを安全なものとして扱い、スクリーンショットに表示されないようにするか、安全でないディスプレイで表示されないようにします。安全な表面と安全なディスプレイの詳細については、FLAG_SECUREを参照してください。定数値:8192(0x00002000)より、ここから読むdeveloper.android.com/reference/android/view/...
Jithu PS

改善点をロールバックして投稿を改ざんしないでください
FelixSFD

8

単一のアクティビティにのみ該当するすべての回答を見ましたが、アクティビティにコードを追加せずにすべてのアクティビティのスクリーンショットをブロックする解決策があります。まず、カスタムアプリケーションクラスを作成し、。を追加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">

すべてのケースで機能しますか?
gopalanrc

私は自分のプロジェクトを試してみたところ、すべてのアクティビティで機能しました。@gopalanrc
Gk Mohammad Emon

2

この公式ガイドによるとWindowManager.LayoutParams.FLAG_SECURE、ウィンドウレイアウトに追加でき、スクリーンショットは許可されません。


2

このソリューションを使用して、アプリが手動でスナップショットを作成できるようにし、アプリがバックグラウンドになったときに画面キャプチャを許可しないようにしています。

@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();
}

0

写真のスクリーンショットについて、FLAG_SECUREがルート権限を取得されたデバイスで機能しない。

ただし、スクリーンショットファイルを監視すると、元のファイルが取得されないようにすることができます。

この試すものを

1.スクリーンショット(ファイルモニター)をAndroidリモートサービスで監視
2.元のスクリーンショット画像を削除します。
3.変更できるようにビットマップインスタンスを配信します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.