Changing screen brightness programmatically (as with the power widget)
This is the complete code I found to be working:
Settings.System.putInt(this.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, 20);
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness =0.2f;// 100 / 100.0f;
getWindow().setAttributes(lp);
startActivity(new Intent(this,RefreshScreen.class));
The code from my question does not work because the screen doesn't get refreshed. So one hack on refreshing the screen is starting dummy activity and than in on create of that dummy activity to call finish()
so the changes of the brightness take effect.
changing screen brightness programmatically in android
How about using the IHardwareService interface for this? An example can be found in this tutorial.
Update: tutorial link still works, but actual code is also available in next answer.
Changing Screen brightness in 6.0 programmatically
Apparently you need to explicitly ask the user for permission on devices running Android 6.0+.
Try the following code: (I have modified it for you)
@TargetApi(Build.VERSION_CODES.M)
public void setBrightness(View view,int brightness){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.System.canWrite(getApplicationContext()))
{
if (brightness < 46)
brightness = 255;
else if (brightness > 47)
brightness = 0;
ContentResolver cResolver = this.getApplicationContext().getContentResolver();
Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
} else
{
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + this.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
Note that you need the WRITE_SETTINGS permission in your manifest, also.
Change screen brightness after click on widget. Android
This line in your sample is probably wrong:
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 200);
There is no MODE value 200.
You should probably do something like this:
Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
Changing screen brightness efficiently
The following affects immediately the single activity, no need to restart it. The activity also remembers the screenBrightness attribute over pause/resume.
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = 1; // 0f - no backlight ... 1f - full backlight
getWindow().setAttributes(lp);
But it has no effect if you have automatic backlight level enabled in the system settings. This solution should help to turn off automatic backlight.
Update Display Brightness on Android after changing it programmatically
I had a similar issue and just created an Activity with no UI to do the brightness change, used an intent to run it from the App Widget.
Changing the Screen Brightness System Setting Android
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. 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.
This is the code for 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:
<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, whatever that may be. Until i included this line, closing DummyBrightnessActivity would bring up my main activity.
android:excludeFromRecents="true"
makes this activity not available in the list of recently launched apps, which you definetely want.
android:theme="@style/EmptyActivity"
defines the way DummyBrightnessActivity looks like to the user, and this is where you make it invisible. This is how you define this style in the styles.xml file:
<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. 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.
Related Topics
Callback to a Fragment from a Dialogfragment
Android:How to Set Onclick Event for Button in List Item of Listview
Asynctask Won't Stop Even When the Activity Has Destroyed
Android Inject_Events Permission
Android Linearlayout:Add Border with Shadow Around a Linearlayout
Could Not Find Com.Android.Tools.Build:Gradle:3.0.0-Alpha1 in Circle Ci
How to Use Searchview in Toolbar Android
Android Popupwindow with Tooltip Arrow
Defining Z Order of Views of Relativelayout in Android
How to Play Videos in Android from Assets Folder or Raw Folder
Android Sdk Manager Won't Open
Ideal Way to Set Global Uncaught Exception Handler in Android
Call Activity Method from Adapter
How to Bring an Activity to Foreground (Top of Stack)