背景
アプリによっては、セキュリティやコンテンツ的にスクショや画面録画を禁止したいときがあると思います。
そのとき Android の機能である WindowManager.LayoutParams.FLAG_SECURE
を Activity の OnCreate()
で呼ぶ必要があります。
しかし、Unity だとどうするのか分からなかったので調べてまとめた記事になります。
FLAG_SECURE を設定するとどうなるか
- スクショを無効化
- 画面録画(スクリーンレコーディング)をすると、録画した画面が真っ黒になる
- タスク画面・タスク一覧で、アプリ画面を真っ白にできる
動作確認環境
- Unity 2018.4.22f1
※ Unity2018.2以前のバージョンを使っている場合は、以下の手順とは異なるかと思いますので、ご注意ください。
手順
Unity + Android で実現するためには、
-
UnityPlayerActivity
を拡張して新しい Activity を定義する - 新しい Activity が使用されるように
AndroidManifest.xml
を修正する - 新しい Activity の
OnCreate()
にFLAG_SECURE
を設定する
という手順が必要です。
1. UnityPlayerActivity
を拡張する
自分が作業中の Unityプロジェクトの Assets/Plugins/Android
配下に新しい Activity を作成します。
例として、 OverrideExample
クラスを作成します。
ちなみに、 package name 以外のファイル内容は、Unity公式からそのままコピペしています。
UnityPlayerActivity Java コードの拡張 - Unity マニュアル
package name は、自分が設定した名前に置き換えてください。
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/Android
に AndroidManifest.xml
を配置します。
android:name
の部分は、1.
で作成したクラス名に合わせてください。
<?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
を設定します。
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アプリでキャプチャーをされたくないときにする方法