LoginSignup
8
2

More than 3 years have passed since last update.

【Unity】Android アプリでスクショや画面録画などを禁止する

Last updated at Posted at 2021-01-12

背景

アプリによっては、セキュリティやコンテンツ的にスクショや画面録画を禁止したいときがあると思います。
そのとき Android の機能である WindowManager.LayoutParams.FLAG_SECURE を Activity の OnCreate() で呼ぶ必要があります。

しかし、Unity だとどうするのか分からなかったので調べてまとめた記事になります。

FLAG_SECURE を設定するとどうなるか

  • スクショを無効化
  • 画面録画(スクリーンレコーディング)をすると、録画した画面が真っ黒になる
  • タスク画面・タスク一覧で、アプリ画面を真っ白にできる

動作確認環境

  • Unity 2018.4.22f1

※ Unity2018.2以前のバージョンを使っている場合は、以下の手順とは異なるかと思いますので、ご注意ください。

手順

Unity + Android で実現するためには、

  1. UnityPlayerActivity を拡張して新しい Activity を定義する
  2. 新しい Activity が使用されるように AndroidManifest.xml を修正する
  3. 新しい Activity の OnCreate()FLAG_SECURE を設定する

という手順が必要です。

1. UnityPlayerActivity を拡張する

自分が作業中の Unityプロジェクトの Assets/Plugins/Android 配下に新しい Activity を作成します。
例として、 OverrideExample クラスを作成します。

ちなみに、 package name 以外のファイル内容は、Unity公式からそのままコピペしています。
UnityPlayerActivity Java コードの拡張 - Unity マニュアル
package name は、自分が設定した名前に置き換えてください。

OverrideExample.java
package com.DefaultCompany.ExtendUnityPlayerActivity;
import com.unity3d.player.UnityPlayerActivity;
import android.os.Bundle;
import android.util.Log;

public class OverrideExample extends UnityPlayerActivity {

  protected void onCreate(Bundle savedInstanceState) {

    // UnityPlayerActivity.onCreate() を呼び出す
    super.onCreate(savedInstanceState);

    // logcat にデバッグメッセージをプリントする
    Log.d("OverrideActivity", "onCreate called!");
  }

  public void onBackPressed()
  {
    // UnityPlayerActivity.onBackPressed() を呼び出す代わりに、Back ボタンイベントを無視する
    // super.onBackPressed();
  }
}

2. AndroidManifest.xml を修正する

Activity と同様に Assets/Plugins/AndroidAndroidManifest.xml を配置します。
android:name の部分は、1. で作成したクラス名に合わせてください。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product">
  <application android:icon="@drawable/app_icon" android:label="@string/app_name">
    <activity android:name=".OverrideExample"
             android:label="@string/app_name"
             android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  </application>
</manifest>

この状態で、Androidビルドして問題なくアプリが使用できるか確認してください。
特に、 package name を間違えるとアプリがクラッシュしたりするので、注意してください。

3. FLAG_SECURE を設定する

onCreate()FLAG_SECURE を設定します。

OverrideExample.java
package com.DefaultCompany.ExtendUnityPlayerActivity;
import com.unity3d.player.UnityPlayerActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;

public class OverrideExample extends UnityPlayerActivity {

  protected void onCreate(Bundle savedInstanceState) {

    // UnityPlayerActivity.onCreate() を呼び出す
    super.onCreate(savedInstanceState);

    // logcat にデバッグメッセージをプリントする
    Log.d("OverrideActivity", "onCreate called!");

    //FLAG_SECUREの設定
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
  }

  public void onBackPressed()
  {
    // UnityPlayerActivity.onBackPressed() を呼び出す代わりに、Back ボタンイベントを無視する
    // super.onBackPressed();
  }
}

これで作業は完了です。
Androidビルドして、問題なければスクショや画面録画ができなくなっていると思います。

参考文献

UnityPlayerActivity Java コードの拡張 - Unity マニュアル
Androidアプリでキャプチャーをされたくないときにする方法

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2