How to detect if screen brightness has changed in

2020-07-18 04:08发布

问题:

I have searched extensively and couldn't find a similar question.

I would like to know if there is any way to detect when the screen brightness of a mobile device has been changed.

I have already tried to store the old value when the app starts and repeatedly check usingSettings.System.getInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS); to compare the initial and final value of screen brightness , which is not a good way of doing so.

Thanks

EDIT: This question states that I have already tried the solution of using Settings.System.SCREEN_BRIGHTNESS to get current screen values and periodically check for screen brightness changes. I am looking for a more efficient way of doing such an operation.

回答1:

yes, there is a way by using ContentObserver:

  • code:

    // listen to the brightness system settings
    val contentObserver = object:ContentObserver(Handler())
    {
        override fun onChange(selfChange:Boolean)
        {
            // get system brightness level
            val brightnessAmount = Settings.System.getInt(
                    contentResolver,Settings.System.SCREEN_BRIGHTNESS,0)
    
            // do something...
        }
    }
    
    // register the brightness listener upon starting
    contentResolver.registerContentObserver(
            Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),
            false,contentObserver)
    
    // .....
    
    // unregister the listener when we're done (e.g. activity destroyed)
    contentResolver.unregisterContentObserver(contentObserver)
    
  • permission in AndroidManifest.xml:

    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    
  • for API >= 23, you need to request the permission through Settings Activity

other useful links:

  • ContentObserver onChange
  • Change the System Brightness Programmatically


回答2:

There are no receivers provided to detect brightness change.

You have to run a Service or Thread to check the brightness change by yourself.

Settings.System.getInt(getContext().getContentResolver(), 
             Settings.System.SCREEN_BRIGHTNESS);

The above code will give you current system brightness level. Periodically detect the brightness and compare with the old one.

Note: If the system is in Auto Brightness mode, you can't get current brightness level. See this answer.