OnToucListener上的屏幕亮了吗?

时间:2013-07-14 22:20:50

标签: android button touch settings screen-brightness

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

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”权限通过应用程序覆盖此设置。 任何帮助,将不胜感激。请尽可能清楚,因为我还在学习这个平台。感谢

1 个答案:

答案 0 :(得分:4)

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

  1. 从系统设置中读取并存储当前亮度级别。
  2. 在你的应用中做任何你想做的事。
  3. 将保存的级别恢复为系统设置。
  4. 作为开发人员,您可以尊重用户对亮度的原始设置。因此,只要您尊重用户,您操纵自动亮度设置的想法实际上是最佳做法。

    这是两个有用的功能,第一个读取当前级别(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活动,其额外的用户选择亮度,因为设置更改不会立即生效。

    4. 为了完整性,这里是活动代码:

      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

      权限。

      希望这会有所帮助......