160

私が現在構築しているアプリには、セキュリティ上の理由から、アプリがバックグラウンドにプッシュされているときに、OS がアプリのスクリーンショットを撮らないようにする必要があるという要件があります。これにより、アプリを切り替えるときに、最後にアクティブだった画面を見ることができなくなります。

この機能をアプリケーション クラスの onPause メソッドに組み込む予定ですが、まず、この機能を実現する方法を見つける必要があります。

それで、これを修正する方法の手がかりを持っている人はいますか?

4

7 に答える 7

288

試してください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 : ただし、アクティビティのすべてが保護されるわけではありません。ポップアップ ウィンドウ ( DialogSpinnerAutoCompleteTextView、アクション バーのオーバーフローなど) は安全ではありません。Dialogそれを呼び出しgetWindow()て設定することで問題を解決できますFLAG_SECURE。残りは...トリッキーになります。詳細については、このブログ投稿を参照してください。

于 2012-03-22T12:48:45.167 に答える
79

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デバイス(またはそれ以前)に限定されていると思います。

于 2012-06-20T14:33:04.057 に答える
13

CommonsWare が提供するソリューションは、Lollipop でも引き続き有効です。

アプリ全体の最近のリストにスナップショットを引き続き表示したくない場合は実装されているすべてのアクティビティで、メソッドの 前にフラグを指定する必要があります。onCreate()getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);setContentView();

それ以外の場合、最近のリストのスナップショットは、ユーザーがナビゲートした場合、フラグのない最初のアクティビティを表示します。

于 2015-03-20T10:39:40.437 に答える
2

アプリがバックグラウンドに置かれたときに、アプリのコンテンツをスプラッシュ スクリーンで覆うことにより、アプリのコンテンツを非表示にするソリューションを次に示します。これは FLAG_SECURE 手法を使用していません。画面の onPause メソッドと onResume メソッドをオーバーライドし、背面のすべてをカバーするビューを表示するようにビューを変更するだけです。

https://stackoverflow.com/a/52976001/6686912

于 2018-10-24T18:50:31.257 に答える
2

アプリがバックグラウンドまたは実行中のすべてのアプリのスティックであり、アプリ内アプリがスクリーンショットを許可する必要がある場合に、アプリを保護する必要があるソリューション(画面オーバーレイ)を誰かが探している場合。以下を試してください:-

@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);
    }
于 2021-05-31T10:18:59.087 に答える