Unity app 中调整 Android 手机屏幕亮度

using System;
using System.Collections;
using System.Runtime.InteropServices;
using UnityEngine;
using LuaInterface;

public class ChangeCubeColor : MonoBehaviour
{
    private static int BRIGHTNESS_SCALE = 255;
#if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern float GetBrightnessNative();

    [DllImport("__Internal")]
    private static extern void SetBrightnessNative(float value);
#endif

    public float moveSpeed = 10f;

    private static float activityBrightness = -1;   // 当前app中屏幕亮度(仅Android)
    private static float systemBrightness = -1;     // 系统屏幕亮度
    private static int targetBrightness = 10;
    private static string debugLog;

#if UNITY_ANDROID
    # region 获取当前系统屏幕亮度(0 - 255)
    static int TryGetBrightness()
    {
        // 获取当前activity屏幕亮度(0 - 1)
        //AndroidJavaObject Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        //AndroidJavaObject Window = Activity.Call<AndroidJavaObject>("getWindow");
        //AndroidJavaObject Attributes = Window.Call<AndroidJavaObject>("getAttributes");
        //activityBrightness = Attributes.Get<float>("screenBrightness");

        // 获取当前系统屏幕亮度(0 - 255)
        AndroidJavaObject uActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject uContentResolver = uActivity.Call<AndroidJavaObject>("getContentResolver");
        AndroidJavaClass uSystemSetting = new AndroidJavaClass("android.provider.Settings$System");
        return uSystemSetting.CallStatic<int>("getInt", uContentResolver, "screen_brightness");
    }
    #endregion

    #region 调整当前activity屏幕亮度(0 - 1)
    static void TrySetActivityBrightness(int brightness)
    {
        float targetBrightness = brightness / 255.0f;
        AndroidJavaObject uActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        // 在这个里边不能做计算
        uActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
        {
            AndroidJavaObject uWindow = uActivity.Call<AndroidJavaObject>("getWindow");
            AndroidJavaObject uAttributes = uWindow.Call<AndroidJavaObject>("getAttributes");
            uAttributes.Set("screenBrightness", targetBrightness);
            uWindow.Call("setAttributes", uAttributes);
        }));
    }
    #endregion

    #region 调整当前系统屏幕亮度(0 - 255), 需要申请用户权限
    static void TrySetSystemBrightness(int brightness)
    {
        AndroidJavaObject uActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        
        AndroidJavaObject ContentResolver = uActivity.Call<AndroidJavaObject>("getContentResolver");
        AndroidJavaClass SystemSetting = new AndroidJavaClass("android.provider.Settings$System");
        AndroidJavaClass Build_Version = new AndroidJavaClass("android.os.Build$VERSION");
        int SDK_INT = Build_Version.GetStatic<int>("SDK_INT");

        //判断是否有修改设置权限
        if (!SystemSetting.CallStatic<bool>("canWrite", uActivity))
        {
            //如果大于等于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:" + uActivity.Call<string>("getPackageName")));
                //Intent = Intent.Call<AndroidJavaObject>("addFlags", 268435456);
                uActivity.Call("startActivity", Intent);
            }
        }
        //修改系统亮度
        else
        {
            SystemSetting.CallStatic<bool>("putInt", ContentResolver, "screen_brightness", brightness);

            // 修改完需要将activity的亮度设为-1,就是跟随系统
            uActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
            {
                var Window = uActivity.Call<AndroidJavaObject>("getWindow");
                var Attributes = Window.Call<AndroidJavaObject>("getAttributes");
                Attributes.Set("screenBrightness", -1);
                Window.Call("setAttributes", Attributes);
            }));
        }
    }
    #endregion
#endif

    static int GetBrightness()
    {
#if UNITY_EDITOR
        return -1;
#elif UNITY_IOS || UNITY_TVOS
        return (int)(GetBrightnessNative() * BRIGHTNESS_SCALE);
#elif UNITY_ANDROID
        int brightness = -1;
        brightness = TryGetBrightness();
        return brightness;
#endif
        return 0;
    }

    static void SetBrightness(int brightness)
    {
#if UNITY_EDITOR
        return;
#elif UNITY_IOS || UNITY_TVOS
        SetBrightnessNative(1.0f * brightness / BRIGHTNESS_SCALE);
#elif UNITY_ANDROID
        TrySetActivityBrightness(brightness);
#endif
    }

    void Start()
    {
        // 获取当前系统屏幕亮度
        systemBrightness = GetBrightness();
    }

    void OnGUI()
    {
        GUI.Label(new Rect(100, Screen.height / 2 - 100, 600, 400), "position.x: " + transform.position.x.ToString());
        GUI.Label(new Rect(100, Screen.height / 2 - 200, 600, 400),  "width: " + Screen.currentResolution.width.ToString());

        GUI.Label(new Rect(100, Screen.height / 2, 600, 400), "DebugLog: " + debugLog);

        GUI.Label(new Rect(100, Screen.height / 2 + 200, 600, 400), "activityBrightness: " + activityBrightness);
        GUI.Label(new Rect(100, Screen.height / 2 + 300, 600, 400), "systemBrightness: " + systemBrightness);
    }

    private void OnMouseDown()
    {
        SetBrightness(targetBrightness);
        targetBrightness += 10;
        GetBrightness();

        GetComponent<Renderer>().material.color = Color.red;
        transform.Translate(Vector3.left * 2f * Time.deltaTime);
    }

    // Update is called once per frame
    void Update()
    {
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值