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

来源:互联网 发布:网络信息收集软件 编辑:程序博客网 时间:2024/05/16 10:42

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

获取当前Activity亮度

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

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

设置当前Activity亮度

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

获取系统亮度

AndroidJavaObject Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");AndroidJavaObject ContentResolver = Activity.Call<AndroidJavaObject>("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<AndroidJavaObject>("currentActivity");        ContentResolver = Activity.Call<AndroidJavaObject>("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<AndroidJavaObject>("setAction", "android.settings.action.MANAGE_WRITE_SETTINGS");                Intent = Intent.Call<AndroidJavaObject>("setData", new AndroidJavaObject("android.net.Uri").CallStatic<AndroidJavaObject>("parse", "package:" + Activity.Call<string>("getPackageName")));                Intent = Intent.Call<AndroidJavaObject>("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

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