web-dev-qa-db-fra.com

Éteindre l'écran sur Android

J'essaie d'allumer et d'éteindre l'affichage après une action donnée (nous nous inquiétons simplement d'éteindre l'écran pour l'instant). D'après ce que j'ai compris de wake lock, voici ce que j'ai:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);    
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");

Lorsque je lis d'autres articles sur stackoverflow et ailleurs, ils semblent me dire que PARTIAL_WAKE_LOCK éteindra l'écran. Mais si je lis le Kit de développement logiciel (SDK), il dit qu’il ne permet que d’éteindre l’écran. Donc, je pense que ce n'est pas correct.

Toute allusion serait utile! Merci,

Mike

18
thegreyspot

Il y a deux choix pour éteindre l'écran:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);

// Choice 1
manager.goToSleep(int amountOfTime);

// Choice 2
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
wl.release();

Vous aurez probablement aussi besoin de cette permission:

<uses-permission Android:name="Android.permission.WAKE_LOCK" />

METTRE À JOUR:

Essayez cette méthode. Android éteint l'écran lorsque le niveau de lumière est suffisamment bas.

WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 0;
getWindow().setAttributes(params);
16
A. Abiri

Ce qui suit est copié à partir de Document SDK . Si vous souhaitez garder l’écran activé, je pense que SCREEN_BRIGHT_WAKE_LOCK est suffisant.


Flag Value                CPU   Screen  Keyboard

PARTIAL_WAKE_LOCK          On*    Off      Off

SCREEN_DIM_WAKE_LOCK       On     Dim      Off

SCREEN_BRIGHT_WAKE_LOCK    On     Bright   Off

FULL_WAKE_LOCK             On     Bright   Bright

7
jiangyan.lily

Pour moi, ces méthodes ne fonctionnaient pas. J'ai donc utilisé un autre scénario (non trivial) pour éteindre mon écran.

Android a 2 drapeaux qui sont responsables pour être éveillé: 

  • Affichage -> Heure de l'écran 
  • Application -> Développement -> Restez éveillé tout en chargeant la case.

J'ai utilisé le flux suivi:

  1. Tout d’abord, sauvegardez votre configuration précédente, par exemple le délai d’écran était de 1 min et restez éveillé pendant la charge cochée.

  2. Ensuite, décochez Rester éveillé pendant la charge et réglez le délai d’affichage de l’écran sur une durée minimale.

  3. Je m'inscris pour diffuser le service du récepteur pour obtenir un événement de cet écran Android désactivé.

  4. Lorsque l’événement est désactivé sur l’écran, j’ai paramétré la configuration précédente par défaut: le délai d’écran était de 1 minute et rester éveillé pendant le chargement coché.

  5. Désinscrire un destinataire

Après 15 secondes l'appareil dort

Voici des extraits de code:

BroadcastReceiver

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;

/**
 * Catch Screen On/Off
 * */
public class BroadcastReceiverScreenListener extends BroadcastReceiver{

private BroadCastListenerCallBackItf mBroadCastListenerCallBack = null;

public BroadcastReceiverScreenListener(
        BroadCastListenerCallBackItf broadCastListenerCallBack) {
    this.mBroadCastListenerCallBack = broadCastListenerCallBack;
}

@Override
public void onReceive(Context arg0, Intent intent) {


    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        mBroadCastListenerCallBack.broadCastListenerCallBack__ScreenOff_onResponse();
    }       
}

}

Interface utilisée comme rappel

public interface BroadCastListenerCallBackItf {
    public void broadCastListenerCallBack__ScreenOff_onResponse();
}

2 méthodes de la classe principale:

....

AndroidSynchronize mSync = new AndroidSynchronize();

....

public void turnScreenOff(int wait){
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);

    BroadCastListenerCallBackItf broadCastListenerCallBack = this;

    BroadcastReceiver mReceiver = new BroadcastReceiverScreenListener(broadCastListenerCallBack);       
    m_context.registerReceiver(mReceiver, filter);



    //set Development --> disable STAY_ON_WHILE_PLUGGED_IN
    Settings.System.putInt(
            m_context.getContentResolver(), 
            Settings.System.STAY_ON_WHILE_PLUGGED_IN,
            0                                );



    // take current screen off time 
    int defTimeOut = Settings.System.getInt(m_context.getContentResolver(), 
            Settings.System.SCREEN_OFF_TIMEOUT, 3000);
    // set 15 sec
    Settings.System.putInt(m_context.getContentResolver(), 
            Settings.System.SCREEN_OFF_TIMEOUT, 15000);

    // wait 200 sec till get response from BroadcastReceiver on Screen Off
    mSync.doWait(wait*1000);


    // set previous settings
    Settings.System.putInt(m_context.getContentResolver(), 
            Settings.System.SCREEN_OFF_TIMEOUT, defTimeOut);

    // switch back previous state
    Settings.System.putInt(
            m_context.getContentResolver(), 
            Settings.System.STAY_ON_WHILE_PLUGGED_IN,
            BatteryManager.BATTERY_PLUGGED_USB);


    m_context.unregisterReceiver(mReceiver);


}





public void broadCastListenerCallBack__ScreenOff_onResponse() {
    mSync.doNotify();
}

....

Classe AndroidSynchronize

public class AndroidSynchronize {

    public void doWait(long l){
        synchronized(this){
            try {
                this.wait(l);
            } catch(InterruptedException e) {
            }
        }
    }       

    public void doNotify() {
        synchronized(this) {
            this.notify();
        }
    }   

    public void doWait() {
        synchronized(this){
            try {
                this.wait();
            } catch(InterruptedException e) {
            }
        }
    }
}

[MODIFIER]

Vous devez enregistrer une autorisation:

Android.permission.WRITE_SETTINGS
4
Maxim Shoustin

Par ceci link , vous pouvez aussi éteindre l’écran comme ceci: 

Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000);

1000 est en millisecondes, ce qui signifie 1 seconde. Vous pouvez le remplacer par toute valeur souhaitée.

Autorisation nécessaire:

<uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
1
Kristy Welsh