secure español android service settings screen-brightness

android - español - settings system



Cambio del sistema de brillo de la pantalla Configuración de Android (4)

Estoy intentando cambiar el brillo de la pantalla de un servicio, así:

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

El problema es que no funciona. Bueno, en realidad tiene éxito en cambiar la configuración de brillo, pero la luminosidad de la pantalla no cambia realmente hasta que entro en la configuración del teléfono, miro el nuevo valor y presiono Ok.

¿Hay algo que deba hacer después de establecer el valor para que cambie el brillo?


Acabo de registrarme en JB. El siguiente código es suficiente para configurar el brillo de un servicio

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);

La primera línea anula el brillo automático.


Es posible que tengas que hacerlo a través del objeto Window .

Por ejemplo,

WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness= lp.screenBrightness*1.25; getWindow().setAttributes(lp);


He tenido el mismo problema de cambiar el brillo de la pantalla desde un servicio, y hace un par de días lo resolví con éxito (y actualicé el calendario de mi aplicación con la función de brillo;)). Ok, entonces este es el código que pones a tu servicio:

// 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);

Tenga en cuenta que en el fragmento de código anterior estoy usando dos variables para el brillo. Uno es brightness , que es un número flotante entre 0.0 y 1.0, el otro es brightnessInt , que es un número entero entre 0 y 255. La razón de esto es que Settings.System requiere un número entero para almacenar el valor de brillo en todo el sistema, mientras que lp.screenBrightness que verá en el siguiente fragmento de código requiere una flotación. No me preguntes por qué no usar el mismo valor, esta es la forma en que se encuentra en el SDK de Android, así que solo tendremos que vivir con él.

Este es el código para 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); } }

Así es como agrega su actividad al AndroidManifest.xml, probablemente la parte más importante:

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

Una pequeña explicación sobre qué es qué.

android:taskAffinity debe ser diferente, que el nombre de su paquete! Hace que DummyBrightnessActivity se inicie no en su pila principal de actividades, sino en una actividad separada, lo que significa que cuando DummyBrightnessActivity está cerrado, no verá la siguiente actividad, sea la que sea. Hasta que incluí esta línea, cerrar DummyBrightnessActivity mostraría mi actividad principal.

android:excludeFromRecents="true" hace que esta actividad no esté disponible en la lista de aplicaciones lanzadas recientemente, que definitivamente desea.

android:theme="@style/EmptyActivity" define la forma en que DummyBrightnessActivity se parece al usuario, y aquí es donde lo haces invisible. Así es como se define este estilo en el archivo 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>

De esta manera, su DummyBrightnessActivity será invisible para el usuario. No estoy seguro si todos esos parámetros de estilo son realmente necesarios, pero me funciona de esta manera.

Espero que eso lo explique, pero si tiene alguna pregunta, hágamelo saber.


Una forma menos intrusiva (usando significativamente menos código) es:

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);