現在作成中のアプリには、セキュリティ上の理由でアプリがバックグラウンドにプッシュされるときに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を使用するアプリなど)からも保護します。
UPDATE:Now On TapまたはAndroid 6.0の他のアシスタントに対しても保護します。ユーザーがアシスタントを呼び出すと、UIのウィジェットとコンテナの詳細にアクセスできません。
UPDATE#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でも引き続き有効です。
not全体アプリの最近のリストのスナップショットを参照し続ける場合は、実装されたすべてのアクティビティがonCreate()
メソッドで指定する必要がありますgetWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
の前のsetContentView();
フラグ
そうでない場合、最近のリストのスナップショットには、ユーザーがナビゲートしたときにフラグなしで最初のアクティビティが表示されます。
以下は、アプリがバックグラウンドに置かれたときにスプラッシュスクリーンでアプリを隠すことにより、アプリのコンテンツを非表示にするためのソリューションです。これはFLAG_SECURE手法を使用していないため、画面のonPauseメソッドとonResumeメソッドをオーバーライドし、ビューを変更して、背後のすべてをカバーするビューを表示します。