7
votes

Comment détecter la plage de luminosité de l'écran sur Android?

J'utilise le code suivant pour définir la luminosité de l'écran, ce qui fonctionne bien sur la plupart des téléphones:

    protected fun setBrightness(value: Float) {
        //Set the system brightness using the brightness variable value
        Settings.System.putInt(contentResolver, Settings.System
            .SCREEN_BRIGHTNESS, (value * 255).toInt())
        //Get the current window attributes
        val layoutpars = window.getAttributes()
        //Set the brightness of this window
        layoutpars.screenBrightness = value
        //Apply attribute changes to this window
        window.setAttributes(layoutpars)
    }

Lorsque je passe une valeur de 1, ce qui signifie la valeur maximale, cela est converti en 255 qui est considérée comme la plus grande valeur pour régler la luminosité de l'écran. Cependant, sur un Xiaomi Mi8, régler la valeur sur 255 ne définira pas la luminosité sur la plage complète, comme le montre cette capture d'écran:

 entrez la description de l'image ici

Après avoir imprimé quelques valeurs de débogage et expérimenté, il semble que sur le Xiaomi Mi8, la valeur de luminosité maximale est en fait de 1024 (ou du moins, multiplier 1 par cette valeur définit la barre de luminosité complète).

Il semble que différents appareils Android peuvent avoir des échelles de luminosité différentes. Existe-t-il une API pour obtenir la valeur maximale de la luminosité, donc je n'ai pas besoin de coder en dur différentes constantes?


5 commentaires

Avez-vous trouvé une solution utilisable pour cela? Quelle solution avez-vous finalement mise en œuvre?


J'ai ajouté une zone de texte pour permettre aux utilisateurs de spécifier une valeur maximale manuellement.


Merci, c'est ce que j'ai fait aussi (mais avec un spinner avec des valeurs prédéfinies). Avez-vous une expérience sur les valeurs existantes? Autant que je sache, 255, 1023 et 3999 (sur la base de la réponse) existent.


Aucune idée, mais sur certains téléphones Xiaomi, l'insertion d'une valeur plus élevée a jeté une exception, je laisse donc les utilisateurs mettre n'importe quelle valeur et détecter les erreurs.


ok, merci pour vos commentaires


3 Réponses :


2
votes

Il est spécifique à certains appareils Xiaomi. Par exemple, Xiaomi Redmi Note 7 a une plage de 0 à 4000.

La documentation officielle définit la plage SCREEN_BRIGHTNESS entre 0 et 255. Donc, je pense qu'il n'y a pas d'API pour obtenir la valeur maximale de la luminosité.

Sur certains appareils (pas tous), il existe un fichier "/ sys / class / leds / lcd-backlight / max_brightness" qui peut contenir une valeur maximale.


3 commentaires

Le fichier "/ sys / class / leds / lcd-backlight / max_brightness" est-il dans chaque appareil, ou est-ce uniquement pour Xiaomi? Je ne le trouve pas dans mon appareil. Dois-je être root pour y accéder?


certains appareils. Ce n'est pas documenté, donc ce n'est pas fiable. Ce n'est pas spécifique à Xiaomi.


Au moins affecte OnePlus et Xiaomi. Avec une gamme différente! La réponse Aswin semble cependant faire l'affaire.



1
votes

Au lieu de vous définir 255 comme valeur maximale. Je préfère utiliser cette méthode pour régler la luminosité sur max. Il suffit de passer 1F à l'écranBrightness.

WindowManager.LayoutParams layout = getWindow().getAttributes();
layout.screenBrightness = 1F;
getWindow().setAttributes(layout);

Cela fonctionne bien sur différents appareils Android.


1 commentaires

Ne fonctionne pas sur OnePlus (il faut le régler sur 4F) et ne fonctionne pas sur POCO F2 Pro non plus où il doit être réglé sur 8F.



2
votes

Utilisez cette méthode pour obtenir la valeur maximale de la luminosité

public int getMaxBrightness(Context context, int defaultValue){

    PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    if(powerManager != null) {
        Field[] fields = powerManager.getClass().getDeclaredFields();
        for (Field field: fields) {

            //https://android.googlesource.com/platform/frameworks/base/+/android-4.3_r2.1/core/java/android/os/PowerManager.java

            if(field.getName().equals("BRIGHTNESS_ON")) {
                field.setAccessible(true);
                try {
                    return (int) field.get(powerManager);
                } catch (IllegalAccessException e) {
                    return defaultValue;
                }
            }
        }
    }
    return defaultValue;
}

J'ai testé cela sur quelques appareils (principalement des appareils Android 9, 10, y compris certains appareils xiaomi, qui définissent généralement la luminosité plus élevée que l'habituel 255), et il semble que cela fonctionne.

Google n'encourage pas l'accès aux champs / méthodes masqués à l'aide de la réflexion. Toute mise à jour Android pourrait potentiellement casser cette solution.

Une autre solution possible serait d'accéder à la méthode getMaximumScreenBrightnessSetting () dans la classe PowerManager en utilisant la réflexion. Mais je ne l'ai pas testé et je ne peux donc pas confirmer les résultats.

NB : Si vous utilisez cette valeur pour définir le pourcentage de luminosité, gardez ceci à l'esprit: à partir d'Android 9 , la luminosité est réglée logarithmiquement . Ainsi, le réglage du pourcentage de luminosité peut ne pas ressembler au pourcentage indiqué dans le curseur de luminosité (les pourcentages inférieurs peuvent sembler plus élevés que la valeur définie sur le curseur de luminosité), mais la luminosité physique sera réglée à droite.


1 commentaires

Merci pour cette découverte, cela fonctionne très bien sur POCO F2 Pro! Max est 2047