由於我要在程序中實現改變屏幕亮度,可是在網上一找,全是要先導出爲安卓工程,或者是創建插件,這些都太煩了。
其實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表達式把代碼傳遞給參數。
由此則可以完美實現修改亮度,希望可以幫助到大家,轉載請註明出處。