Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android】FLAG_SECUREでスクリーンショットとバックグラウンド時の画面表示を防ぐ方法

銀行アプリやパスワード管理ツールなど、セキュリティ上の理由からスクリーンショットを許可したくないケースは少なくありません。本記事では、WindowManager.LayoutParams.FLAG_SECURE フラグを使用して、Androidアプリの画面キャプチャや、アプリがバックグラウンドに移行した際のタスクプレビュー表示を防止する方法を解説します。

FLAG_SECUREとは?

FLAG_SECURE は、ウィンドウの内容を「安全なもの」として扱うためのシステムフラグです。このフラグを設定すると、次のような効果が得られます。

  • スクリーンショットが撮影できなくなる(撮影すると真っ黒な画像になる)
  • 画面録画にも内容が記録されない
  • 最近使ったアプリ一覧(タスクスイッチャー)のサムネイルが黒く表示される

実装手順

ステップ1:新規プロジェクトの作成

Android Studioを開き、「File」→「New Project」を選択して、必要事項を入力し新しいプロジェクトを作成します。

ステップ2:レイアウトファイルの編集

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:gravity="center"
    android:orientation="vertical">
   <TextView
        android:id="@+id/openYoutube"
        android:text="Open youtube application"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

上記のコードでは、動作確認用のサンプルビューとして TextView を1つ配置しています。

ステップ3:MainActivity.java の編集

src/MainActivity.java に以下のコードを記述します。

package com.example.andy.myapplication;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity {
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
        WindowManager.LayoutParams.FLAG_SECURE);
        setContentView(R.layout.activity_main);
    }
}

重要なのは onCreate() 内で呼び出している次の1行です。親ウィンドウに対して FLAG_SECURE を設定することで、現在のアクティビティにおけるスクリーンショットを防止できます。

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);

動作確認

それでは実際にアプリを実行してみましょう。Android端末をPCに接続し、Android Studioのツールバーから「Run」アイコンをクリックします。実行デバイスとして自分のスマートフォンを選択すると、端末にアプリの初期画面が表示されます。

【Android】FLAG_SECUREでスクリーンショットとバックグラウンド時の画面表示を防ぐ方法

この状態でスクリーンショットを撮影してみると、結果は以下のように真っ黒な画像となり、画面の内容が一切記録されないことが確認できます。

まとめ

FLAG_SECURE を設定するだけで、わずか数行のコードでスクリーンショット対策を実装できます。一方で、ユーザーが正当な目的で画面を保存できなくなるという副作用もあるため、適用対象は機密情報を扱う場面に限定するのが望ましいでしょう。金融系アプリや認証画面など、情報漏洩リスクの高い箇所に導入するのに適した手法です。

  1. 【Android】スクリーンショットが禁止されたアプリで撮影する2つの方法

    Androidが多くのテクノロジー愛好家に選ばれる最大の理由のひとつは、その圧倒的な自由度の高さです。好きなアプリを自由にインストールでき、スマートフォンのほぼすべての要素を自分好みにカスタマイズできます。 しかし、そんなAndroidにも「できないこと」があります。たとえば、一部のアプリはさまざまな理由からスクリーンショットの撮影を制限しています。一方でユーザー側にも、どうしてもスクリーンショットを撮りたい場面があるでしょう。この記事では、その制限を回避する方法を詳しく解説します。 なぜ一部のアプリはスクリーンショットを制限するのか? 開発者がスクリーンショットを制限するのには、それなりの理

  2. Androidで写真撮影中の通知をブロックする方法|MacroDroid活用術

    スマートフォンのカメラ性能はここ数年で飛躍的に向上し、誰でも手軽に高品質な写真を撮れるようになりました。しかし、いざシャッターを切ろうという瞬間に通知が画面に割り込んでくると、せっかくのベストショットを逃してしまうことがあります。 「何でもアプリで解決できる」という言葉通り、写真撮影中に通知が邪魔をしないよう制御してくれるアプリも存在します。今回は無料で使いやすい自動化アプリ「MacroDroid」を使って、カメラ使用時に通知をブロックする方法をご紹介します。 カメラアプリ使用時に通知をブロックする手順 友人全員を集めてやっと記念写真を撮ろうとした瞬間に、通知が画面に表示される——こんな経験