1

我正在构建一个在屏幕中间有一个“主”按钮的应用程序。每当按下按钮(并保持)时,应用程序应将屏幕调暗(尽可能低),当释放按钮时,应将屏幕重置为原始状态。这是我的应用程序如何处理按钮的触摸和释放事件的一段代码,

holdButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                lowerScreenBirghtness
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                resetScreenBirghtness();
                }
            }
            return true;
        }
    });

我做了一些研究,发现有些手机有自动亮度控制的问题。我知道通过具有“WRITE_SETTINGS”权限的应用程序覆盖此设置的可能方法。任何帮助,将不胜感激。请尽可能清楚,因为我仍在学习这个平台。谢谢

4

1 回答 1

4

如果要控制屏幕亮度,则必须将其设置为手动模式,因为当您在活动中更改亮度并且系统设置为自动时,许多设备会出现各种问题。所以你的方法应该如下:

  1. 从系统设置中读取并存储当前亮度级别。
  2. 在您的应用程序中做任何您想做的事情。
  3. 将保存的级别恢复到系统设置中。

作为开发人员,您应该尊重用户对亮度的原始设置。因此,只要您尊重用户,您操纵自动亮度设置的想法实际上是最佳实践。

这里有两个有用的函数,第一个读取当前级别 (0-255),如果亮度处于自动模式,则返回 -1,如果由于某种原因无法读取设置,则返回 -2。第二个将亮度级别设置为您想要的级别,如果您将 -1 作为 brLevel 传递,它将亮度设置为自动。

    public static int getBrightnessLevel(Context cx) {
        int result = -1;

        if (cr == null) cr = cx.getContentResolver();

        if (cr != null) {
            boolean isAuto = false;

            try {
                isAuto = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS_MODE, 0) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; 
            } catch (Exception ex) {
                isAuto = false;
            }

            if (isAuto) {
                result = -1;
            } else {
                try {
                    result = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS);
                } catch (Exception ex) {
                    result = -2;
                }               
            }
        } else {
            result = -2;
        }

        return result;
    }

    public static void setBrightnessLeve(Context cx, int brLevel) {
        if (cr == null) cr = cx.getContentResolver();

        if (cr != null) {
            try {
                if (brLevel >= 0) {
                    Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
                    Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brLevel);
                } else {
                    Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
                }
            } catch (Exception ex) {
                //Do Nothing...
            }
        }
    }

我开发了一个亮度小部件,它控制整个系统的屏幕亮度,并且仅适用于一个应用程序,这是我正在使用的方法:

  1. 用户通过滑动控制选择他想要的级别(10 - 100)。这里要小心,不要让用户选择小于 10% 的东西,否则屏幕会变暗,他将无法恢复亮度,因为他什么都看不到。

  2. 我正在更改系统设置中的亮度设置以反映用户选择。

  3. 我正在启动一个非 ui 活动,目的是增加用户选择的亮度以设置屏幕亮度,因为设置更改不会立即生效。

为了完整起见,这里是活动代码:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.WindowManager;

public class act_brightnesshelper extends Activity {
    //----- Private Static Members -----
    private static final String     TAG = "act_brightnesshelper";
    //----- Private Static Members END -----



    //----- Private Members -----
    private int brightnessLevel;
    //----- Private Members END -----   



    //----- Activity Overrides -----
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate");
        super.onCreate(savedInstanceState);

        brightnessLevel = this.getIntent().getExtras().getInt("brightnessLevel");
    }

    @Override
    public void onAttachedToWindow() {
        Log.d(TAG, "onAttachedToWindow brightnessLevel = " + brightnessLevel);
        super.onAttachedToWindow();

        WindowManager.LayoutParams lp = getWindow().getAttributes();

        try {
            lp.screenBrightness = brightnessLevel / 255f;
            getWindow().setAttributes(lp);
        } catch(Exception ex) {
            //Do Nothing...
        }

        //Finish the Activity after 500ms...
        Thread WaitThread = new Thread(){
            @Override  
            public void run() {
                try {Thread.sleep(500);} catch (InterruptedException e) {}
                finish();
            }           
        };
        WaitThread.start();     
    }
    //----- Activity Overrides END----- 
}

当然,您的应用程序具有不同的功能,但如果您选择这种方式,您可以从我的代码中获得您需要的内容。最后,正如您所说,您将需要

android.permission.WRITE_SETTINGS

允许。

希望这可以帮助...

于 2013-07-14T23:00:28.977 回答