2011-02-17 17 views
13

estoy usando el siguiente para establecer el modo de brillo automático del sistema y el nivel:no se puede aplicar sistema de brillo de la pantalla mediante programación en Android

android.provider.Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE, 0); 
    android.provider.Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, y.brightness1); 

que puede cambiar de auto-brighess de encendido y apagado, y establecer diferentes niveles . La configuración parece aplicarse correctamente: puedo ir a Configuración -> Pantalla -> Brillo, y cualquier configuración que establezca se muestra realmente correctamente. Sin embargo, la pantalla actual no está cambiando su brillo. Si solo toco el control deslizante en Configuración de pantalla, todo se aplicará.

Debería mencionar que estoy ejecutando una aplicación con una actividad principal, y estas configuraciones se están aplicando en BroadcastReceiver. Intenté crear una actividad simulada y probé las cosas allí, pero obtuve los mismos resultados.

Respuesta

16

OK, encontró la respuesta aquí: Refreshing the display from a widget?

Básicamente, tiene que hacer una actividad transparente que procese el cambio de brillo. Lo que no se menciona en el post es que usted tiene que hacer:

Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_MODE, 0); 
Settings.System.putInt(y.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, brightnessLevel); 

luego hacer

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

Y si se llama acabado() inmediatamente después de aplicar los cambios, el brillo será en realidad nunca cambiará porque la disposición tiene que crearse antes de que se aplique la configuración de brillo. Así que terminé creando un hilo que tenía un retraso de 300ms, luego se llama finish().

+0

Lástima que este método no es confiable como una roca (falla del Android). Debido a todos los tiempos, puede encontrar casos de esquina cuando falla, por ejemplo, al bloquear (aquí establezco un nuevo brillo) y al desbloquear el teléfono.Si hay una pausa entre esos 2 eventos, funciona, pero si las acciones están una al lado de la otra, se ignorará el cambio de brillo. – greenoldman

+0

establece permanentemente el brillo en 0 o lo que sea y tiene que cambiar la configuración manualmente de, entonces, – Saqib

2

Estoy haciendo algo similar con el brillo de la pantalla en una de mis aplicaciones, y lo hago a través de WindowManager y funciona. Estoy usando el siguiente código para obtener el brillo de la pantalla actual (y guardarlo para más tarde) y ponerlo en plena:

WindowManager.LayoutParams lp = getWindow().getAttributes(); 
    previousScreenBrightness = lp.screenBrightness; 
    float brightness = 1; 
    lp.screenBrightness = brightness; 
    getWindow().setAttributes(lp); 
+2

gracias , y esto definitivamente es una mejora, pero realmente no funciona correctamente, solo funciona si La actividad ficticia se está ejecutando, y tiene que abrirla para cambiar la obstrucción. Intenté que la actividad terminara inmediatamente después del cambio, pero luego el brillo no cambió. – user496854

+4

Además, me acabo de dar cuenta de que esto controla el brillo de solo la actividad actual. Una vez que está cerrado, el brillo se restablece a la configuración predeterminada del sistema. Volvemos a la pregunta original: ¿cómo puedo aplicar la configuración del sistema de brillo? – user496854

+0

¡Impresionante! esto era exactamente lo que necesitaba. Estaba configurando el screenbrightness directamente y no se estaba actualizando. De hecho, necesitaba establecer los atributos de la ventana para obligarlo a actualizar. ¡Aclamaciones! – Pellet

1

Creé un método estático en mi clase de aplicación que invoco de todos mis métodos Activity.onResume().

MyApplication extends Application { 
    ... 
    public static void setBrightness(final Activity context) { 
     // get the content resolver 
     final ContentResolver cResolver = context.getContentResolver(); 
     // get the current window 
     final Window window = context.getWindow(); 

     try { 
      // get the current system brightness 
      int brightnessLevel = System.getInt(cResolver,System.SCREEN_BRIGHTNESS); 
      // get the current window attributes 
      LayoutParams layoutpars = window.getAttributes(); 
      // set the brightness of this window 
      layoutpars.screenBrightness = brightnessLevel/(float) 255; 
      // apply attribute changes to this window 
      window.setAttributes(layoutpars); 
     } catch (SettingNotFoundException e) { 
      // throw an error cuz System.SCREEN_BRIGHTNESS couldn't be retrieved 
      Log.e("Error", "Cannot access system brightness"); 
      e.printStackTrace(); 
     } 
    } 
} 

MyActivity extends Activity { 
    ... 
    public void onResume() { 
     super.onResume(); 
     Log.d(TAG, "onResume()"); 
     MyApplication.setBrightness(this); 
    } 
} 
+1

Una vez más, esto no hará lo que necesito, es el mismo código que Rich publicado en febrero. Esto solo afecta el brillo de su aplicación, no de todo el teléfono – user496854

+0

Llamemos a una actividad un contexto –

1

Utilice la respuesta dada por "user496854" por encima
Si usted está tomando máximo screenBrightness = 255 y luego mientras se hace

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

screenBrightness dividir por 255, como

WindowManager.LayoutParams lp = getWindow().getAttributes(); 
lp.screenBrightness = brightness/(float)255; 
getWindow().setAttributes(lp); 
+0

Me salvó el día ... Muchas gracias – Phillen

Cuestiones relacionadas