在Unity中获取、修改安卓设备系统亮度与Activity亮度

上一篇在Unity里调整安卓当前Activity亮度发布后,发现了一些其他问题,在这里总结一下在Unity中分别调整和获取安卓系统与Activity的亮度的代码。
(日常无奈习惯Ctrl+S)

获取当前Activity亮度

AndroidJavaObject Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity"); 
AndroidJavaObject Window = Activity.Call("getWindow"); 
AndroidJavaObject Attributes = Window.Call("getAttributes"); 
float Brightness = Attributes.Get("screenBrightness");

如果返回值Brightness为-1,那么说明当前是跟随系统亮度的。

设置当前Activity亮度

请参考上一篇博客中的代码。(传送门)

获取系统亮度

AndroidJavaObject Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity");
AndroidJavaObject ContentResolver = Activity.Call("getContentResolver");
AndroidJavaClass SystemSetting = new AndroidJavaClass("android.provider.Settings$System");
float Brightness = SystemSetting.CallStatic<int>("getInt",ContentResolver,"screen_brightness") / 256.0f;

此Brightness即为系统亮度,范围0-1,和下拉状态栏里拖动的那个值一样。

设置系统亮度

在Android 6.0之后,需要在AndroidManifest.xml中声明修改系统设置权限,并且还要用户进入某面板手动授权修改权限,较为复杂。
完整解决方案:
一、修改AndroidManifest.xml
将准备好的(复制Unity自带或是已有的)AndroidManifest.xml放在/Assets/Plugins/Android中,加入以下权限:

<manifest ..............>
    ......
    <uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>
    ......
</manifest>

二、修改系统亮度代码

    private AndroidJavaObject Activity, ContentResolver;
    private AndroidJavaClass SystemSetting;

    private void Start()
    {
        Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity");
        ContentResolver = Activity.Call("getContentResolver");
        SystemSetting = new AndroidJavaClass("android.provider.Settings$System");
    }
    //在Start函数中获取Activity等对象


    public void SetSystemBrightness(int Value)
    //Value 取值范围 0-255
    {
        //获取当前安卓SDK版本
        AndroidJavaClass Build_Version = new AndroidJavaClass("android.os.Build$VERSION");
        int SDK_INT = Build_Version.GetStatic<int>("SDK_INT");
        //判断是否有修改设置权限
        if (!SystemSetting.CallStatic<bool>("canWrite", Activity))
        {
            //如果大于等于23(安卓6.0)呼出授权界面
            if (SDK_INT >= 23)
            {
                AndroidJavaObject Intent = new AndroidJavaObject("android.content.Intent");
                Intent = Intent.Call("setAction", "android.settings.action.MANAGE_WRITE_SETTINGS");
                Intent = Intent.Call("setData", new AndroidJavaObject("android.net.Uri").CallStatic("parse", "package:" + Activity.Call<string>("getPackageName")));
                Intent = Intent.Call("addFlags", 268435456);
                Activity.Call("startActivity", Intent);
            }
        }
        //修改系统亮度
        else SystemSetting.CallStatic<bool>("putInt", ContentResolver, "screen_brightness", Value);
    }

Value取值范围0-255。

总结

建议使用修改Activity亮度,获取高权限难免会引起用户反感。
况且只修改Activity亮度,应用退出后还会自动复原系统亮度,岂不美哉?
若一开始想获取Activity亮度但得到-1的返回值,意味着和系统亮度同步,请先使用获取系统亮度得到值。

Unity版本 5.6.2f1

如有问题请评论,欢迎转载,请注明出处。

你可能感兴趣的:(Unity)