Posted at

UnityからiOS&Androidの画面輝度をMAXにする方法

現在QRコードを使用したアプリの開発をしており、QR表示画面で画面輝度をMAXにする機能を実装するための備忘録。。

UnityからOSの画面輝度をiOS、Androidともに変更することができなそうだったので各OSごとにネイティブプラグインを実装した。


環境

・HIAWAY VTR-L29 Android8.0.0, API26

・iphoneX

・Unity(version 2018.3.0f2)


参考

画面輝度のネイティブプラグインについて

https://qiita.com/GeneralD/items/5e77121cf0b26a103d38

ネイティブプラグインってなに?っていう状態の人向け→この動画を参考にして勉強しました。

・iOS

https://youtu.be/zP5mjHzJR-o?list=LL_wGxSuSiBEf1EWiFFdo4pA

・Android

https://www.youtube.com/watch?v=bmNMugkOQBI&list=PLj-rpMEVqe_iaQHssCAtpEgrO3M_tIS3y


iOS

まずUnityのAssets/Plugins/iOSにBrightnessPlugin.mmを配置


brightness.mm

#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h

#ifdef __cplusplus
extern "C" {
#endif

void setBrightness(float val) { [UIScreen mainScreen].brightness = val; }

#ifdef __cplusplus
}
#endif


一度ビルドするとXcodeのLibraries/Plugins/iOS以下にBrightnessPlugin.mmが作られます。


Android

※※※Androidネイティブプラグインも実装はしてみたものの正常に動作せず、色々試してみたものの、全てうまく行かず、、、(どなたかAndroidネイティブプラグインの実装にお詳しい方がいたらご教授いただけると、、)

なので、Unity側から直接Androidの画面輝度を実装します。


Unity側の実装

次にUnity側からiOSにはBrightnessPlugin.mmに定義したメソッドを呼び出すようなc#インターフェースを実装します。AndroidにはAndroidJavaClassから直接javaを実行します。


SetBrightness.cs

using System;

using UnityEngine;

#if !UNITY_EDITOR && UNITY_IOS
using System.Runtime.InteropServices;
#endif

public static class SetBrightness
{
#if !UNITY_EDITOR && UNITY_IOS
[DllImport("__Internal")]
private static extern void setBrightness(float brightness);
#endif

public static void DoAction(float maxbright) {
#if UNITY_EDITOR
#elif UNITY_IOS
setBrightness(maxbright);
#elif UNITY_ANDROID
var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
var window = activity.Call<AndroidJavaObject>("getWindow");
var lp = window.Call<AndroidJavaObject>("getAttributes");
lp.Set("screenBrightness", maxbright);
window.Call("setAttributes", lp);
}));
#endif
}
}


使用したいスクリプト上で

SetBrightness.DoAction(1.0f);

とかすると画面輝度が最大になります。

ちなみにDoActionの引数は0~1.0fでないと多分エラー吐きます。(実証してません)

※※※iOS上で試しましたがアプリの実行中にコントロールパネルで画面輝度を変更したり、iPhoneの電源ボタンをタップし、再度開いてアプリに戻っても画面輝度が最大になりません。(お詳しい方がいましたらよろしくおねがいします、、!)