回答:
試してください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
。残りはトリッキーになります。詳細については、このブログ投稿を参照してください。
FLAG_SECURE
最初から存在していた-最近まで意味が限られていた。
FLAG_SECURE
である場合、それは低レベルであるため、それを防御しません。同様に、独自のウィジェット階層をBitmap
取得しCanvas
、それを-backed に描画させた場合、FLAG_SECURE
おそらくそれに対して防御しないでしょう。自分のウィジェットの独自のスクリーンショットを撮っているので、おそらくそこに「安全な」ものを望んでいたからです。最近のタスクのサムネイルなどFLAG_SECURE
、システムのスクリーンショット用です。
一部のデバイス(Samsung Galaxy ACE、たとえばGT-S5830で検証済み)では、WindowManager.LayoutParams.FLAG_SECUREの使用に注意してください。これにより、ビューがスクランブルになります。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の電話で正常に機能しているため、問題はジンジャーブレッドデバイス(またはそれ以前)に限定されていると想定しています。
CommonsWareが提供するソリューションは、Lollipopでも引き続き有効です。
アプリ全体の最新のリストにスナップショットを表示しないようにしたい場合は、実装されているすべてのアクティビティでメソッドの
前にフラグを指定する必要がありますonCreate()
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
setContentView();
それ以外の場合、最近のリストのスナップショットには、ユーザーがナビゲートした場合、フラグのない最初のアクティビティが表示されます。
アプリがバックグラウンドに置かれたときに、アプリのコンテンツをスプラッシュスクリーンで覆うことにより、アプリのコンテンツを非表示にするためのソリューションを次に示します。これはFLAG_SECURE手法を使用していません。単に画面のonPauseメソッドとonResumeメソッドをオーバーライドし、ビューを変更してすべてをカバーするビューを表示します。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
これは私にとってはうまくいきました。スクリーンショットを撮ったり、内蔵またはサードパーティの録音アプリケーションが画面を録音したりするのを防ぎます。
これは、すべてのアクティビティのsetContentViewの前にこれらの行をonCreateに追加した後の作業です。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);