关于Android 设置屏幕亮度(适配Api23及更高版本)

       这个需求应用场景主要是在有些页面进入需要调节当前屏幕亮度,查找相关资料都是api 23之前的,翻墙看了些文档,找到了解决方案,特此记录下。

    我们知道在api 23之后权限需要动态去申请,但是有部分特殊权限这样是申请不到的,只有通过弹出设置窗口才能获取得到的。

Special permissions

There are a couple of permissions that don't behave like normal and dangerous permissions. SYSTEM_ALERT_WINDOWand WRITE_SETTINGS are particularly sensitive, so most apps should not use them. If an app needs one of these permissions, it must declare the permission in the manifest, and send an intent requesting the user's authorization. The system responds to the intent by showing a detailed management screen to the user.

For details on how to request these permissions, see the SYSTEM_ALERT_WINDOW and WRITE_SETTINGS reference entries.

All permissions provided by the Android system can be found at Manifest.permission.

以上说的是SYSTEM_ALERT_WINDOW和 WRITE_SETTINGS 是特别敏感的权限,一般app不能去使用他们,如果必须使用,首先需要在manifest中定义,并且在用的时候发送一个intent,系统会弹出一个管理页面来响应这个intent让用户来确认是否给予这个权限。

Note: If the app targets API level 23 or higher, the app user must explicitly grant this permission to the app through a permission management screen. The app requests the user's approval by sending an intent with actionSettings.ACTION_MANAGE_WRITE_SETTINGS. The app can check whether it has this authorization by calling Settings.System.canWrite().

以上说的是我们可以通过Settings.System.canWrite()来检测是否有修改WRITE_SETTINGS权限,如果没有我们需要发一个action为Settings.ACTION_MANAGE_WRITE_SETTINGSintent给系统,系统会弹窗来让用户授权;

具体代码如下:

   public static boolean checkWriteSettingPermission(Activity context, int requestCode) {
        boolean permission;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            permission = Settings.System.canWrite(context);
        } else {
            permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;
        }
        if (!permission) {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                intent.setData(Uri.parse("package:" + context.getPackageName()));
                context.startActivityForResult(intent, requestCode);
            } else {
                ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_SETTINGS}, requestCode);
            }
        }
        return permission;
    }

以上代码检测是否有WRITE_SETTINGS,没有的话去请求用户授权;


    /**
     * 获取屏幕亮度模式和屏幕亮度,并设置为手动模式调节亮度到最高
     */
    private void customScreenBrightness() {
        try {
            /**
             * * 获得当前屏幕亮度的模式
             * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度
             * SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度
             *
             */
            screenMode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
            Log.i(TAG, "screenMode = " + screenMode);
            // 获得当前屏幕亮度值 0--255
            screenBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
            Log.i(TAG, "screenBrightness = " + screenBrightness);

            if (screenMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
                setScreenMode(Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
            }

            setScreenBrightness(255);
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 设置屏幕亮度模式
     * SCREEN_BRIGHTNESS_MODE_AUTOMATIC=1 为自动调节屏幕亮度
     * SCREEN_BRIGHTNESS_MODE_MANUAL=0 为手动调节屏幕亮度
     *
     * @param value
     */
    private void setScreenMode(int value) {
        Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, value);
    }

    /**
     * 设置屏幕亮度
     *
     * @param value
     */
    private void setScreenBrightness(float value) {
        Window mWindow = getWindow();
        WindowManager.LayoutParams params = mWindow.getAttributes();
        float f = value / 255.0f;
        params.screenBrightness = f;
        mWindow.setAttributes(params);
        // 保存设置的屏幕亮度值
        Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, (int) value);
    }

以上代码是对屏幕亮度的操作;

 

 

 

具体参考有:

[1]. https://developer.android.com/guide/topics/permissions/overview

[2].https://developer.android.com/reference/android/Manifest.permission#WRITE_SETTINGS

[3]. https://stackoverflow.com/questions/32083410/cant-get-write-settings-permission

[4]. https://blog.csdn.net/android_ls/article/details/8678313

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 屏幕适配度可以通过使用不同的限定符来实现。其中,最常用的是使用smallestWidth限定符。这个限定符可以根据设备的最小宽度来适配屏幕。绝大部分设备的最小宽度都大于360dp,因此可以使用smallestWidth限定符来适配大多数设备,只需要添加少量的dimens.xml文件即可。另外,如果需要区分横竖屏适配,可以在目录名中加上land(横屏)或port(竖屏)来区分。例如,横屏适配可以使用layout-land目录,竖屏适配可以使用layout-port目录。\[2\]\[3\] #### 引用[.reference_title] - *1* [【Android】之屏幕适配](https://blog.csdn.net/yang553566463/article/details/127029556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android屏幕尺寸适配常见方案smallestWidth](https://blog.csdn.net/cat_is_so_cute/article/details/124458433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android屏幕适配总结](https://blog.csdn.net/u011082160/article/details/121042471)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值