2012-02-18 8 views
5

Estoy simplemente tratando de activar y desactivar el brillo automático. empecé con este código (dentro del método onCreate)¿Cómo activar y desactivar el brillo automático? (no es una repetición)

final ToggleButton autoBrightToggle = (ToggleButton) findViewById(R.id.brightToggle); 

    // display auto brightness state 
    final ToggleButton autoBrightToggle = (ToggleButton) findViewById(R.id.autoToggle); 
    autoOnOrOff.setText(String.valueOf(getAutoBrightnessMode())); 

    autoBrightToggle.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      if (autoBrightToggle.isChecked()) { 
       setAutoBright(true); 
      } else { 
       setAutoBright(false); 
      } 
     } 
    }); // end anonymous OnClickListener function 

    // toggle the brightness mode 
    private void setAutoBright(boolean mode) { 
     if (mode) { 
     Settings.System.putInt(cr, SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC); 
     autoOnOrOff.setText(String.valueOf(getAutoBrightnessMode())); 
     } else { 
     Settings.System.putInt(cr, SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL); 
     autoOnOrOff.setText(String.valueOf(getAutoBrightnessMode())); 
     } 
    } 

Lo cual no parece funcionar. El método setAutoBrightnessMode() también se llama nuevamente en onResume() pero con los mismos no resultados. De todos modos, lo siento si alguien siente que esta pregunta es redundante, pero las otras publicaciones no me llevaron a donde tengo que ir.

(Fwiw - Estoy probando esto en mi viejo Droid X y mi Galaxy Nexus, no el emulador)

editado - ACTUALIZACIÓN EN ESTE: Estoy 99% seguro ahora que no estoy viendo ninguna cambia al modo de Brillo automático reflejado en el panel Configuraciones y widgets de escritorio - aunque De hecho, puedo estar cambiando su valor. parte del problema es que no sé exactamente cómo determinar si el brillo automático está activado o no.

Por ejemplo, ¿la pantalla cambia rápida y visiblemente? He estado esperando cambios inmediatos visibles en el brillo de acuerdo con el entorno, pero tal vez los cambios sean sutiles. y durante un período más largo? o tal vez tome 30 segundos o más de cambio en el entorno antes de que cambie el brillo?

¿Puede alguien sugerir cómo puedo rastrear esto? He intentado consultar la constante Settings.System.SCREEN_BRIGHTNESS_MODE - enganchando este método hasta un campo de texto:

private int getAutoBrightnessMode() { 
    try { 
     int brightnessMode = Settings.System.getInt(cr, SCREEN_BRIGHTNESS_MODE); 
    } catch (Settings.SettingNotFoundException e) { 
     e.printStackTrace(); 
     int brightnessMode = -10000; 
    } 
    return brightnessMode; 
    } 

Pero siempre lee 0, incluso después de una onResume(). : - ((

Sé que este es un procedimiento simple, pero estoy tratando de aprender esto por mi cuenta, y casi no he tenido entrenamiento formal en CS ... Así que todo lo que puedo decir es que soy muy frustrado por esto y siento que yo he trabajado en una esquina y en este momento estoy tan molesto que no puedo pensar con claridad más.

así ayuda sería grande.

+0

nada ?? ¡Esperaba que esto fuera algo simple! –

+0

Supongo que tendrás que otorgar los permisos apropiados en el manifiesto de Android (por ejemplo, 'android.permission.WRITE_SETTINGS') también. –

+0

gracias - Hice eso. debería haber mencionado eso. –

Respuesta

8

utilizo siguiente enfoque en mi aplicación. Probado en HTC Desire HD y en un par de tabletas chinas noname.
Añadir al permiso de manifestación:

<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 

Y use el siguiente código para alternar el brillo automático. Hay un truco en el código: necesitamos "actualizar" el brillo de la aplicación manualmente, porque no cambia automáticamente. Puede ser que es el problema en tu caso.

void setAutoBrightness(boolean value) { 
    if (value) { 
     Settings.System.putInt(getContentResolver(), SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC); 
    } else { 
     Settings.System.putInt(getContentResolver(), SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL); 
    } 

    // After brightness change we need to "refresh" current app brightness 
    if (isChecked) { 
     refreshBrightness(-1); 
    } else { 
     refreshBrightness(getBrightnessLevel()); 
    } 
} 

private void refreshBrightness(float brightness) { 
    WindowManager.LayoutParams lp = getWindow().getAttributes(); 
    if (brightness < 0) { 
     lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; 
    } else { 
     lp.screenBrightness = brightness; 
    } 
    getWindow().setAttributes(lp); 
} 

int getBrightnessLevel() { 
    try { 
     int value = Settings.System.getInt(getContentResolver(), SCREEN_BRIGHTNESS); 
     // convert brightness level to range 0..1 
     value = value/255; 
     return value; 
    } catch (SettingNotFoundException e) { 
     return 0; 
    } 
} 
+0

gracias por responder a Sergey, pero no estoy seguro de que esa sea la solución a mi pregunta. No tengo problemas para lograr que la pantalla/ventana refleje los cambios que realizo utilizando seekBar, el brillo de la pantalla cambia instantáneamente sin que necesite actualizar manualmente los atributos de la ventana. con respecto al brillo automático, tengo exactamente el mismo código que el método setAutoBrightness, simplemente no parece hacer nada.He intentado utilizar tu idea de 'refrescante' después de establecer los valores de brillo, pero no parece tener NINGÚN efecto sobre si el Brillo automático está en modo Auto o no –

+0

como mencioné anteriormente. Sergey: cómo puedes para decir si el modo ha sido activado o no? Solo estaba mirando la configuración y/o el widget de configuración de energía ... pero empecé a pensar que tal vez no reflejaba los cambios. entonces intenté probarlo moviéndome de oscuro a claro, pero no sé qué tan rápido cambia el brillo, etc. Puedes ver más arriba para obtener una explicación completa de lo que estoy preguntando. –

+0

¿Qué significa 'isChecked' aquí? ¿Dónde estableces esta variable? – Deqing

Cuestiones relacionadas