简体   繁体   English

更改屏幕亮度系统设置 Android

[英]Changing the Screen Brightness System Setting Android

I'm attempting to change the screen brightness from withing a service, like so:我正在尝试通过服务更改屏幕亮度,如下所示:

android.provider.Settings.System.putInt(getContentResolver(),
android.provider.Settings.System.SCREEN_BRIGHTNESS, bright);

Problem is that is doesn't work.问题是那是行不通的。 Well, actually it succeeds in changing the brightness setting, but the screen brightness doesn't actually change till I go into the phones settings, look at the new value and hit Ok.嗯,实际上它成功地改变了亮度设置,但屏幕亮度实际上并没有改变,直到我 go 进入手机设置,查看新值并点击确定。

Is there something I have to do after setting the value to get the brightness to change?设置值后我必须做些什么来改变亮度吗?

I've had the same problem of changing screen brightness from within a service, and a couple days ago i have successfully solved it(and updated my app Phone Schedule with brightness feature;) ).我在从服务中更改屏幕亮度时遇到了同样的问题,几天前我已经成功解决了它(并使用亮度功能更新了我的应用程序电话日程;))。 Ok, so this is the code you put into your service:好的,这是您放入服务的代码:

// This is important. In the next line 'brightness' 
// should be a float number between 0.0 and 1.0
int brightnessInt = (int)(brightness*255);

//Check that the brightness is not 0, which would effectively 
//switch off the screen, and we don't want that:
if(brightnessInt<1) {brightnessInt=1;}

// Set systemwide brightness setting. 
Settings.System.putInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightnessInt);

// Apply brightness by creating a dummy activity
Intent intent = new Intent(getBaseContext(), DummyBrightnessActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("brightness value", brightness); 
getApplication().startActivity(intent);

Please Note that in the above code snippet I'm using two variables for brightness.请注意,在上面的代码片段中,我使用了两个变量来表示亮度。 One is brightness , which is a float number between 0.0 and 1.0, the other one is brightnessInt , which is an integer between 0 and 255. The reason for this is that Settings.System requires an integer to store system wide brightness value, while the lp.screenBrightness which you will see in the next code snippet requires a float.一个是brightness ,它是一个介于 0.0 和 1.0 之间的浮点数,另一个是brightnessInt Int,它是一个介于 0 和 255 之间的 integer。原因是Settings.System需要一个 integer 来存储系统范围的亮度值,而您将在下一个代码片段中看到的lp.screenBrightness需要一个浮点数。 Don't ask me why not use the same value, this is just the way it is in Android SDK, so we're just going to have to live with it.不要问我为什么不使用相同的值,这正是 Android SDK 中的方式,所以我们只能忍受它。

This is the code for DummyBrightnessActivity:这是 DummyBrightnessActivity 的代码:

public class DummyBrightnessActivity extends Activity{

    private static final int DELAYED_MESSAGE = 1;

    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);            
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if(msg.what == DELAYED_MESSAGE) {
                    DummyBrightnessActivity.this.finish();
                }
                super.handleMessage(msg);
            }
        };
        Intent brightnessIntent = this.getIntent();
        float brightness = brightnessIntent.getFloatExtra("brightness value", 0);
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = brightness;
        getWindow().setAttributes(lp);

        Message message = handler.obtainMessage(DELAYED_MESSAGE);
        //this next line is very important, you need to finish your activity with slight delay
        handler.sendMessageDelayed(message,1000); 
    }

}

This is how you add your activity to the AndroidManifest.xml, probably the most important part:这是您将活动添加到 AndroidManifest.xml 的方式,这可能是最重要的部分:

<activity android:name="com.antonc.phone_schedule.DummyBrightnessActivity"
            android:taskAffinity="com.antonc.phone_schedule.Dummy"
            android:excludeFromRecents="true"
            android:theme="@style/EmptyActivity"></activity>

A little explanation about what's what.关于什么是什么的一点解释。

android:taskAffinity must be different, than your package name, It makes DummyBrightnessActivity be started not in your main stack of activities, but in a separate, which means that when DummyBrightnessActivity is closed, you won't see the next activity. android:taskAffinity必须与你的 package 名称不同,这使得 DummyBrightnessActivity 不在你的主活动堆栈中启动,而是在一个单独的活动中启动,这意味着当 DummyBrightnessActivity 关闭时,你将看不到下一个活动。 whatever that may be, Until i included this line.不管是什么,直到我加入了这一行。 closing DummyBrightnessActivity would bring up my main activity.关闭 DummyBrightnessActivity 会带来我的主要活动。

android:excludeFromRecents="true" makes this activity not available in the list of recently launched apps, which you definetely want. android:excludeFromRecents="true"使此活动在您绝对想要的最近启动的应用程序列表中不可用。

android:theme="@style/EmptyActivity" defines the way DummyBrightnessActivity looks like to the user, and this is where you make it invisible. android:theme="@style/EmptyActivity"定义了 DummyBrightnessActivity 对用户的外观,这就是你让它不可见的地方。 This is how you define this style in the styles.xml file:这是您在 styles.xml 文件中定义此样式的方式:

<style name="EmptyActivity" parent="android:Theme.Dialog">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Toast</item>
    <item name="android:background">#00000000</item>
    <item name="android:windowBackground">#00000000</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:colorForeground">#000</item>
</style>

This way your DummyBrightnessActivity will be invisible to the user.这样您的 DummyBrightnessActivity 将对用户不可见。 I'm not shure if all of those style parameters are really necessary, but it works for me this way.我不确定所有这些样式参数是否真的有必要,但它对我有用。

I hope that explains it, but if you have any questions, just let me know.我希望这能解释清楚,但如果您有任何问题,请告诉我。

I just checked in JB.我刚签了JB。 The following code is enough to set brightness from a service以下代码足以从服务设置亮度

            android.provider.Settings.System.putInt(mContext.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
            android.provider.Settings.System.putInt(mContext.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, brightnessInt);

first line overrides the auto brightness.第一行覆盖自动亮度。

A less intrusive way (using significantly less code) is:一种侵入性较小的方式(使用更少的代码)是:

android.provider.Settings.System.putInt(getContentResolver(),
android.provider.Settings.System.SCREEN_BRIGHTNESS, bright);

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
pm.userActivity(SystemClock.uptimeMillis(), false);

You might have to do it through the Window object.您可能必须通过Window object 来完成。

For example,例如,

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

lp.screenBrightness= lp.screenBrightness*1.25;

getWindow().setAttributes(lp);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM