Androidアプリで画面記録を防ぐことはできますか?
Android Secure Applicationを開発したいのですが。その中で、バックグラウンドで実行されている画面記録ソフトウェアを検出して殺す必要があります。スクリーンショットを防ぐためにSECURE FLAGを使用しました。しかし、Android画面のビデオキャプチャを防止することも可能かどうかはわかりません。画面キャプチャ(ビデオ/スクリーンショット)を防ぐ方法を教えてください。
Androidアプリで画面記録を防ぐことはできますか?
Android Secure Applicationを開発したいのですが。その中で、バックグラウンドで実行されている画面記録ソフトウェアを検出して殺す必要があります。スクリーンショットを防ぐためにSECURE FLAGを使用しました。しかし、Android画面のビデオキャプチャを防止することも可能かどうかはわかりません。画面キャプチャ(ビデオ/スクリーンショット)を防ぐ方法を教えてください。
回答:
サポートされている方法では、Androidアプリの画面/ビデオのキャプチャを完全に防止することは不可能です。ただし、通常の Androidデバイスでのみブロックする場合は、SECURE FLAGが重要です。
1)セキュアフラグは、通常のスクリーンショットとビデオキャプチャの両方をブロックします。
また、このリンクのドキュメントには、
ウィンドウフラグ:ウィンドウのコンテンツを安全なものとして扱い、スクリーンショットに表示されないようにするか、安全でないディスプレイで表示されないようにします。
上記のソリューションは確実にアプリケーションがあなたのアプリのビデオをキャプチャするのを防ぎます
2)画面コンテンツをキャプチャする別の方法があります。
ルート権限を取得されたデバイスで、または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
コード行を見つけて削除します。
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)
window?.set...
Windowを作成するかどうかわからないためです。
あなたはあなたのアプリからスクリーンショットを無効にする方法を知っているようで、それに役立つ他の答えがあります。しかし、私はあなたが誰もあなたを与えていないいくつかの重要な情報をあなたに与えるように努めます。
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などの新しいデバイスでも、画面を回転させるとアニメーションの問題が発生することがわかりました。このバグレポートを確認してください。
アプリをデバイスまたはプロファイルの所有者にして、に電話をかけることができますsetScreenCaptureDisabled()
。docsから 、このAPIは次のことを行います。
public void setScreenCaptureDisabled(ComponentName admin、boolean disabled)APIレベル21で追加されました
画面キャプチャを無効にするかどうかを設定するためにデバイス/プロファイルの所有者によって呼び出されます。画面キャプチャを無効にすると、安全なビデオ出力を備えていないディスプレイデバイスにコンテンツが表示されなくなります。安全な表面と安全なディスプレイの詳細については、FLAG_SECUREを参照してください。
発信側のデバイス管理者は、デバイスまたはプロファイルの所有者である必要があります。そうでない場合、セキュリティ例外がスローされます。パラメータadminこのリクエストが関連付けられているDeviceAdminReceiver。画面キャプチャが無効になっているかどうか。
または、MDM(モバイルデバイス管理)パートナーアプリになることもできます。OEMは、デバイスを制御するためにMDMパートナーアプリに追加のAPIを提供します。
現在、これが画面キャプチャの制限を適用できる唯一の方法です。
これを試して:
getWindow().setFlags(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">
このソリューションを使用して、アプリが手動でスナップショットを作成できるようにし、アプリがバックグラウンドになったときに画面キャプチャを許可しないようにしています。
@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();
}