2018年5月4日 : Unity

[Unity] Androidでステータスバーを表示

Androidのステータスバー(上に出るやつ)をとりあえず表示する方法です。

Unity5中期頃からできなくなって以来、たまーに何か手軽な方法が無いか調べたりしていたのですが、この度そこそこ手軽にできたので記事としてここに書置きします。

 

検証環境

  • Unity 5.6.5f1 (2017.4.2.f2でも動作確認)
  • Android実機(InFocus M512)

 

サンプル AndroidFullScreenSelect.cs

using System;	// ※Actionを使う為に追加
using UnityEngine;

public static class AndroidFullScreenSelect {
	// 定数設定
	private const int FLAG_FULLSCREEN = 1024;
	private const int FLAG_FORCE_NOT_FULLSCREEN = 2048;

	private static int flagValue;

	public static void ModeSelect(bool state) {
		// フルスクリーンモードの切り替え

		#if UNITY_ANDROID && !UNITY_EDITOR

		if (state) {
			// フルスクリーン設定
			Screen.fullScreen = true;
			flagValue = FLAG_FULLSCREEN;

		} else {
			// 非フルスクリーン設定
			Screen.fullScreen = false;
			flagValue = FLAG_FORCE_NOT_FULLSCREEN;
		}

		// Activityにフラグをセットする処理
		RunOnAndroidUiThread( SetFlagsInThread );

		#endif

	}

	#if UNITY_ANDROID && !UNITY_EDITOR

	private static void RunOnAndroidUiThread(Action thread) {
		// スレッドをセット
		using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
			using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
				activity.Call("runOnUiThread", new AndroidJavaRunnable(thread));
			}
		}
	}

	private static void SetFlagsInThread() {
		// Windowにフラグをセット
		using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
			using (var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {
				using (var window = activity.Call<AndroidJavaObject>("getWindow")) {
					window.Call("setFlags", flagValue, -1);
				}
			}
		}
	}

	#endif
}

上記の内容のスクリプトをAssets内に追加した上で、どこかのスクリプト内で

  • AndroidFullScreenSelect.ModeSelect(false);  … ステータスバー表示
  • AndroidFullScreenSelect.ModeSelect(true);  … ステータスバー非表示

で切り替わると思います。

ActivityレベルでFLAG_FORCE_NOT_FULLSCREENを設定する事がこれで出来るようです。
 

ちなみに挙動的に気を付けた方がよさそうな部分があって、
Screen.fullScreen = false(true);
此方でナビゲーションバー(ソフトウェアホームボタンほか)の方の表示切り替えが出来るのですが、同時にこれを設定するかしないかで、ウィンドウサイズに違いが出るようです。
「false」だと表示した時に各バー分のサイズが削れて、「true」だとステータスバーがオーバーラップ扱いになります。

大抵ステータスバーとナビゲーションバーはセットになると思うので良いとは思うのですが、ステータスバーだけ制御する場合、上部に乗っかる分の余裕を持ってUIを作る、なんて事態になります。
スクリーンサイズはUnity内で別途管理してるのかもしれません。
 

尚、此方のコード(他、内記述のURL)や記事を参考にしました。
ありがうございます。

■GitHub zeh/unity-tidbits ApplicationChrome.cs
https://github.com/zeh/unity-tidbits/blob/master/application/ApplicationChrome.cs

■Qiita「Unity上からAndroidのステータスバーをいじる メモ」
https://qiita.com/satotin/items/3a819307e08935b8a09c

■Android Developers Reference
https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_FORCE_NOT_FULLSCREEN

 

Unityでなぜステータスバーが封印されたのか分からない点などもあり無保証でお願いいたします。
使う際は一度検証した方が良いと思います。
あと、Java関連の操作だと思うのでNDKでは動かないかもしれません。

出来ればプラグイン作ってネイティブレベルで制御するのが一番よさそうな気はします。

この記事へのコメント

コメントはありません。

コメントを書き込む

※タグは使えません。※メールアドレスは公開されません(記録はされます)。
※初書き込みの場合は承認されるまで表示されません。
※内容によって管理人判断で非承認・非表示化する場合があります。ご了承ください。

18 + nineteen =