私が現在構築しているアプリには、セキュリティ上の理由から、アプリがバックグラウンドにプッシュされているときに、OS がアプリのスクリーンショットを撮らないようにする必要があるという要件があります。これにより、アプリを切り替えるときに、最後にアクティブだった画面を見ることができなくなります。
この機能をアプリケーション クラスの onPause メソッドに組み込む予定ですが、まず、この機能を実現する方法を見つける必要があります。
それで、これを修正する方法の手がかりを持っている人はいますか?
私が現在構築しているアプリには、セキュリティ上の理由から、アプリがバックグラウンドにプッシュされているときに、OS がアプリのスクリーンショットを撮らないようにする必要があるという要件があります。これにより、アプリを切り替えるときに、最後にアクティブだった画面を見ることができなくなります。
この機能をアプリケーション クラスの onPause メソッドに組み込む予定ですが、まず、この機能を実現する方法を見つける必要があります。
それで、これを修正する方法の手がかりを持っている人はいますか?
試してくださいFLAG_SECURE
:
public class FlagSecureTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.main);
}
}
これにより、手動のスクリーンショットや ICS の最近のタスク履歴からの自動スクリーンショットから確実に保護されます。また、画面録画 (メディア プロジェクション API を使用するアプリなど) から保護します。
更新: Android 6.0 の Now On Tap やその他のアシスタントに対しても保護します。ユーザーがアシスタントを立ち上げた場合、UI のウィジェットやコンテナーの詳細にアクセスすることはできません。
更新 #2 : ただし、アクティビティのすべてが保護されるわけではありません。ポップアップ ウィンドウ ( Dialog
、Spinner
、AutoCompleteTextView
、アクション バーのオーバーフローなど) は安全ではありません。Dialog
それを呼び出しgetWindow()
て設定することで問題を解決できますFLAG_SECURE
。残りは...トリッキーになります。詳細については、このブログ投稿を参照してください。
WindowManager.LayoutParams.FLAG_SECUREの使用には注意してください。一部のデバイス(Samsung Galaxy ACE、GT-S5830などで確認済み)では、ビューがスクランブルされます。Samsung固有のバグのようです。私は次のことをお勧めします:
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}
スクランブルされた画面は次のようになります。
ただし、これはICS Samsung電話では正しく機能しているため、問題はGingerbreadデバイス(またはそれ以前)に限定されていると思います。
CommonsWare が提供するソリューションは、Lollipop でも引き続き有効です。
アプリ全体の最近のリストにスナップショットを引き続き表示したくない場合は、実装されているすべてのアクティビティで、メソッドの
前にフラグを指定する必要があります。onCreate()
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
setContentView();
それ以外の場合、最近のリストのスナップショットは、ユーザーがナビゲートした場合、フラグのない最初のアクティビティを表示します。
アプリがバックグラウンドに置かれたときに、アプリのコンテンツをスプラッシュ スクリーンで覆うことにより、アプリのコンテンツを非表示にするソリューションを次に示します。これは FLAG_SECURE 手法を使用していません。画面の onPause メソッドと onResume メソッドをオーバーライドし、背面のすべてをカバーするビューを表示するようにビューを変更するだけです。
アプリがバックグラウンドまたは実行中のすべてのアプリのスティックであり、アプリ内アプリがスクリーンショットを許可する必要がある場合に、アプリを保護する必要があるソリューション(画面オーバーレイ)を誰かが探している場合。以下を試してください:-
@Override
protected void onResume() {
super.onResume();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
@Override
protected void onPause() {
super.onResume();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}