在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表達式把代碼傳遞給參數。
由此則可以完美實現修改亮度,希望可以幫助到大家,轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章