web-dev-qa-db-ja.com

Androidでスクリーンキャプチャを防ぐ方法

Androidアプリケーションで画面の記録を防ぐことはできますか?

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

76
Anand

サポートされている方法でAndroidアプリのスクリーン/ビデオキャプチャを完全に防ぐことは不可能と言います。ただし、normalAndroidデバイスに対してのみブロックしたい場合、SECURE FLAGはかなりのものです。

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

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

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

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

答えを参照してください here

2)画面コンテンツをキャプチャする代替手段があります。

ルート化されたデバイスで別のアプリの画面をキャプチャするか、SDKを使用して、

両方とも、あなたがそれをブロックしたり、通知を受けたりする可能性はほとんどありません。

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

答えを参照してください here

87
RobCob

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

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

setContentView()メソッドの前。

44
Ido Naveh

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

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

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

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

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

17
Rajesh Shetty

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

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

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

2)ここでこの問題に言及した人はいませんでしたが、WindowManager.LayoutParams.FLAG_SECUREを使用するときは十分に注意してください。多くのデバイス(Samsung Galaxy ACEなど、GT-S5830など)で、ビュー全体がスクランブルされることが確認されています。このような、

enter image description here

このようなチェックを入れてください

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

9
Aritra Roy

これを試して:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
9
Jithu P.S

アプリをデバイス/プロファイルの所有者として作成し、setScreenCaptureDisabled()を呼び出すことができます。 docs から、このAPIは次のことを行います。

public void setScreenCaptureDisabled(ComponentName admin、boolean disabled)APIレベル21で追加

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

呼び出し元のデバイス管理者は、デバイスまたはプロファイルの所有者でなければなりません。そうでない場合、セキュリティ例外がスローされます。パラメーターadminこの要求が関連付けられているDeviceAdminReceiver。 disabledスクリーンキャプチャが無効かどうか。

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

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

7
rupesh jain

Javaユーザーの場合

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

Kotlinユーザーの場合

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

この 公式ガイド によると、WindowManager.LayoutParams.FLAG_SECUREをウィンドウレイアウトに追加すると、スクリーンショットが許可されなくなります。

2
r5d

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

@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();
}
1
S.Bozzoni

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

写真のスクリーンショットについては、FLAG_SECUREがルート化されたデバイスで動作していません。

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

これを試してください one

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

0
Soo Chun Jung