I've been trying to set the brightness under the limit of Android settings. There are two similar apps in Google Play doing this:
Shades
Screen Filter
The second one, even allows to use the phone with a black screen, just what I need in my app.
There are a lot of other questions about brightness but not to set it under this system limit, and I've found one question asking almost the same but not helping me:
Brightness Screen Filter
So after a lot of search I've got following code:
int brightness=0; //0 to 255, so I set it to a low level (not enough for me)
ContentResolver cResolver = getContentResolver();
//set the system brightness value, and if active, disable auto mode.
System.putInt(cResolver, System.SCREEN_BRIGHTNESS, brightness);
System.putInt(cResolver, System.SCREEN_BRIGHTNESS_MODE, System.SCREEN_BRIGHTNESS_MODE_MANUAL);
//previous lines don't set the brightness to the current screen so we set it like this:
LayoutParams layoutpars = getWindow().getAttributes();
layoutpars.screenBrightness = brightness / (float)255;
//Now we have brightness to the minimum allowed by Android but
//to achieve what these apps do, I have to reduce alpha of the window to the min
//then the screen is black like I want, and totally usable!
layoutpars.alpha=0.05f;
window.setAttributes(layoutpars);
Here the alpha is the key, this is doing what I want, but only for current window/screen, and I need to save to the system this alpha as default, like I'm doing with the brightness and the Manual mode for applying everywhere.
Do you know how I should do this? I'm unable to find a value "System.SCREEN_ALPHA" to set it with System.putInt or another way to do this.
In the other question I linked before, pheelicks replied with a suggestion of using a transparent non-touchable over screen, but this is not working for me, and the result does not give the feeling of a turned off screen like previous apps.
Thanks.
I decided to implemented this feature just inside my app with alpha. So I couldn't solve the initial question at all....
Anyways, in the end seems that the solution to this question is the one Pheelicks replied here: https://stackoverflow.com/a/4287597/1667990
-This is launching an activity to be always on top,
-with alpha to 0.0f so it be transparent,
-that redirects the touch to the activity behind:
//Let touches go through to apps/activities underneath.
Window window = activity.getWindow();
window.addFlags(FLAG_NOT_TOUCHABLE);
-And most important thing not explained in the previous link, is to set the dim behind our window to 1 (like the dim in a messagebox, but setting to the max to be black behind :D )
window.setDimAmount ((float)1.0) ;
window.setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND,
WindowManager.LayoutParams.FLAG_DIM_BEHIND);
I haven't tried that and decided not to do it in my app as it could bring unexpected behavior in my circumstances, but I think it should definitely work, if anyone try please add your feedback!
Related
I'm trying to get my Android app to keep the screen unlocked as long as the app is running. I easily solved this problem with setting this flag - WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - in each activity.
But now I'd also like to allow the screen to dim and stay dimmed until a touch event is registered. I tried to mess with window object's screenBrightness and dimAmount but none of these worked (no changes in the brightness were made). Any ideas if I can implement this feature?
As a last resort I'd think a black dialog with alpha .5 covering the whole screen would work, but I don't know if this solution will have the same effect as an actual dim, battery-saving wise
I'm trying to set System Screen Brightness instantaneously. I'm using a service to do that. Here it the code that I'm using.
Settings.System.putInt(cResolver,
Settings.System.SCREEN_BRIGHTNESS, 255);
This code works fine. But it is not instantaneous. The screen brightness value changes but the screen still looks dull. I can confirm this by reading back the screen brightness value and it is 255. If I lock the screen and come back, the screen is fully bright. How can I achieve this that the moment I set the system brightness to the maximum, I see fully bright screen?
BTW, I want to do this using a service and not an activity!
I would take a look at this link, specifically the first answer. It's a bit hackish though.
Changing screen brightness programmatically (as with the power widget)
Essentially you need to force the screen to refresh through starting a dummy activity and then finish() said dummy activity. I would have commented but I don't have enough points.
here's my code to change the brightness settings of my phone.
After running the app, if I go to the settings>display>brightness of my phone, I see the value changed however not 'updated'. So when I click on the dialog box's ok/cancel button, that's when it gets updated. So am I missing a call that finally after changing the values will update the screen brightness? Thanks.
The code is in C# though, I am using Xamarin and monodroid to develop my App. Thanks people!
Android.Provider.Settings.System.PutInt(ContentResolver, Android.Provider.Settings.System.ScreenBrightnessMode, 0);
int brightnessInt = (int)(1.0 * 255); //To set max brightness
Android.Provider.Settings.System.PutInt(ContentResolver, Android.Provider.Settings.System.ScreenBrightness, brightnessInt);
View v = Window.DecorView.FindViewById(Android.Resource.Id.Content);
v.Invalidate();
Make sure it's not on auto adjust
Android 2.2: Adjusting screen brightness
The last few lines solve your problem.
Also make sure android:minSdkVersion is at least v 2.3.3
I need to change the screen brightness programmatically. I read multiple solutions like this Can't apply system screen brightness programmatically in Android.
My problem is that those solutions implies changing the activity to be effective (having something like a dummy activity finishing immediately) and I would like to avoid the overhead of an activity switch.
Is there any other solution... maybe using native code so that the screen brightness will change immediately ?
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.
I have been having trouble getting the screen dimensions for android. I do not want the size of the status bars included in my dimenions. The app that I'm developing is to be permanently in landscape mode. I have been testing with the android honeycomb emulator. When I get the dimensions using the code in How can I get android Honeycomb system's screen width and height? I get 1280x800. I was curious as to why the person in the linked question has the size of the status bars subtracted while mine does not work that way. Also, how can I make it so that the size of the status bars is actually subtracted? If any additional details are needed I will be checking periodically to provide. Thanks!
Okay! I finally figured it out. I pieced together code from several different sources so I don't know exactly why things work out the way they do. Here is the relevant code.
Rect rect = new Rect();
Window win = getWindow();
win.getDecorView().getWindowVisibleDisplayFrame(rect);
screenWidth = Math.abs(rect.left-rect.right);
screenHeight = Math.abs(rect.top-rect.bottom);
There is one caveat though. This code WILL NOT work in the onCreate() method. Instead, place it in
public void onWindowFocusChanged (boolean hasFocus)
This should solve any problems with getting window dimensions!
EDIT: I believe this solution should also work in portrait mode as well. I have not tested it though.