Androidアプリケーションで画面の記録を防ぐことはできますか?
Androidセキュアアプリケーションを開発したいと思います。そのため、バックグラウンドで実行されている画面録画ソフトウェアを検出して、それらを強制終了する必要があります。スクリーンショットを防ぐためにSECURE FLAGを使用しました。しかし、Androidスクリーンのビデオキャプチャを防ぐことができるかどうかはわかりません。スクリーンキャプチャ(ビデオ/スクリーンショット)を防ぐ方法を教えてください。
サポートされている方法でAndroidアプリのスクリーン/ビデオキャプチャを完全に防ぐことは不可能と言います。ただし、normalAndroidデバイスに対してのみブロックしたい場合、SECURE FLAGはかなりのものです。
1)セキュアフラグは、通常のスクリーンショットとビデオキャプチャの両方をブロックします。
また、 このリンク のドキュメントには、
ウィンドウフラグ:ウィンドウのコンテンツを安全なものとして扱いますスクリーンショットに表示されたり、安全でないディスプレイで表示されないようにします。
上記のソリューションは、アプリケーションがアプリのビデオをキャプチャするのを確実に防ぎます
答えを参照してください here 。
2)画面コンテンツをキャプチャする代替手段があります。
ルート化されたデバイスで別のアプリの画面をキャプチャするか、SDKを使用して、
両方とも、あなたがそれをブロックしたり、通知を受けたりする可能性はほとんどありません。
たとえば、SDKを介して電話画面をコンピューターにミラーリングするソフトウェアが存在するため、アプリでは検出できない画面キャプチャソフトウェアをそこで使用できます。
答えを参照してください here 。
次の行を追加してください:
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
setContentView()
メソッドの前。
画面キャプチャを無効にするには:
onCreate()
メソッドに次のコード行を追加します。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
画面キャプチャを有効にするには:
LayoutParams.FLAG_SECURE
を見つけて、コード行を削除します。
アプリからスクリーンショットを無効にする方法を知っているようですが、それに役立つ答えが他にもあります。しかし、私はあなたにいくつかを与えようとします重要な情報だれもあなたに与えていないということです。
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のような新しいデバイスでも、画面を回転するとアニメーションの問題が発生することがわかりました。 check このバグレポートをご覧ください。
これを試して:
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
アプリをデバイス/プロファイルの所有者として作成し、setScreenCaptureDisabled()
を呼び出すことができます。 docs から、このAPIは次のことを行います。
public void setScreenCaptureDisabled(ComponentName admin、boolean disabled)APIレベル21で追加
画面キャプチャを無効にするかどうかを設定するために、デバイス/プロファイルの所有者によって呼び出されます。また、スクリーンキャプチャを無効にすると、安全なビデオ出力を持たないディスプレイデバイスにコンテンツが表示されなくなります。安全な表面と安全なディスプレイの詳細については、FLAG_SECUREを参照してください。
呼び出し元のデバイス管理者は、デバイスまたはプロファイルの所有者でなければなりません。そうでない場合、セキュリティ例外がスローされます。パラメーターadminこの要求が関連付けられているDeviceAdminReceiver。 disabledスクリーンキャプチャが無効かどうか。
または、 MDM(モバイルデバイス管理) パートナーアプリになることができます。OEMは、デバイスを制御するためにMDMパートナーアプリに追加のAPIを提供します。パートナー。
現在、これが画面キャプチャ制限を実施できる唯一の方法です。
Javaユーザーの場合
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
Kotlinユーザーの場合
window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
この 公式ガイド によると、WindowManager.LayoutParams.FLAG_SECURE
をウィンドウレイアウトに追加すると、スクリーンショットが許可されなくなります。
このソリューションを使用して、アプリがバックグラウンドになったときに画面キャプチャを許可しない一方で、アプリで手動スナップショットを許可します。
@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();
}
単一のアクティビティにのみ適切なすべての回答を見ましたが、アクティビティにコードを追加せずにすべてのアクティビティのスクリーンショットをブロックするソリューションがあります。まず、カスタムアプリケーションクラスを作成し、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">
写真のスクリーンショットについては、FLAG_SECUREがルート化されたデバイスで動作していません。
ただし、スクリーンショットファイルを監視する場合は、元のファイルを取得できないようにすることができます。
これを試してください one 。
1。 Androidリモートサービスを使用したスクリーンショット(ファイルモニター)の監視
2。元のスクリーンショット画像を削除します。
3。変更できるようにビットマップインスタンスを配信します。