在Unity中调整安卓当前窗口屏幕亮度的实现(无需导出工程或制作插件)

由于我要在程序中实现改变屏幕亮度,可是在网上一找,全是要先导出为安卓工程,或者是创建插件,这些都太烦了。
其实Unity提供了一个很好的和安卓交互的接口,根本不需要另作设置。理论上,只要有安卓代码,都可以在Unity中实现。

先送上调整亮度代码:(已修复)

 void SetApplicationBrightnessTo(float Brightness)
    {
        AndroidJavaObject Activity = null;
        Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        Activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
                     AndroidJavaObject Window = null, Attributes = null;
                     Window = Activity.Call<AndroidJavaObject>("getWindow");
                     Attributes = Window.Call<AndroidJavaObject>("getAttributes"); 
                     Attributes.Set("screenBrightness", Brightness); 
                     Window.Call("setAttributes", Attributes); 
                     })); 
    }

调用方法:

直接调用,如:

SetApplicationBrightnessTo(0.01f);

Brightness的有效范围是0~1,-1。 若设置为-1则跟随系统亮度。本段代码没有设置有效范围检测。

稍作讲解:

无论在安卓里是什么复杂的类,在Unity都有统一的对象 : AndroidJavaObject
首先要获取当前Activity :

AndroidJavaObject Activity = null;
Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");

根据我在网上查找的资料,获得了安卓代码:

Window window = activity.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.screenBrightness = brightness;
window.setAttributes(lp);

正如上面提到的,一切对象都可以用AndroidJavaObject来承载,所以我通过查阅UnityAPI和资料,可以转换上面的代码为:

AndroidJavaObject Window = null, Attributes = null;
Window = Activity.Call<AndroidJavaObject>("getWindow");
Attributes = Window.Call<AndroidJavaObject>("getAttributes");
Attributes.Set("screenBrightness", Brightness);
Window.Call("setAttributes", Attributes);

您不免有些疑问了,那么

Activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
             ......
        }

这些东西是什么呢?
是因为Unity的“主线程”和本身App的主线程并不是同一个,也就是说,如果我们不加这个,就会跨线程修改UI Thread(即安卓主线程),这是不允许的。会出现以下报错:

AndroidJavaException: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

所以我们需要将一段程序通过Activity的runOnUiThread方法传递给主线程执行,Java中的Runnable也有对应的接口:AndroidJavaRunnable。使用Lambda表达式把代码传递给参数。
由此则可以完美实现修改亮度,希望可以帮助到大家,转载请注明出处。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值