web-dev-qa-db-fra.com

Allumer l'écran depuis le récepteur / service

Je souhaite que mon application puisse allumer l'écran et afficher mon application. Supposons que je règle une alarme et que, toutes les heures, je souhaite que mon application s'affiche pendant 2 minutes avant que l'appareil ne dorme naturellement.

Je vois que WakeLock (FULL_LOCK) et KeyguardManager sont obsolètes.

J'ai créé un service et un service WakefulBroadcastReceiver et ceux-ci fonctionnent.

@Override
protected void onHandleIntent(Intent intent) {
    // I need to show the screen here!

    for (int i=0; i<5; i++) {
        Log.i("SimpleWakefulReceiver", "Running service " + (i + 1)
                + "/5 @ " + SystemClock.elapsedRealtime());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
    }
    Log.i("SimpleWakefulReceiver", "Completed service @ " + 
          SystemClock.elapsedRealtime());
    SimpleWakefulReceiver.completeWakefulIntent(intent);
}

Comment puis-je allumer l'écran par programmation, passer le verrouillage et afficher mon activité depuis IntentService?

Merci

20
RuAware

Vous pouvez utiliser ce code pour allumer l'écran.

lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");

lock.disableKeyguard();
wake.acquire();
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

Vous avez besoin de l'autorisation suivante dans le fichier AndroidManifest.xml:

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

MODIFIER (UTILISER CELUI-CI, RIEN IS DÉCONSEILLÉ):
Il existe une autre alternative pour cela, car vous devez lancer une activité. Dans l'activité onCreate(), vous devez ajouter des indicateurs à la fenêtre. Par exemple:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);`
}
25
Kartheek

Je ne sais pas de quoi vous parlez, wakelock n'est certainement pas obsolète. Certains types ne sont plus la façon préférée de Google de faire les choses, mais les wakelocks normaux sont toujours là et toujours la façon la plus simple de le faire. Assurez-vous d'ajouter l'indicateur ACQUIRE_CAUSES_WAKEUP lorsque vous prenez le verrou. En fait, notez qu'un WakefulBroadcastReceiver est implémenté à l'aide de wakelocks.

2
Gabe Sechan

Vous pouvez utiliser ce code pour allumer l'écran.

private void turnScreenOn() {
    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
    getWindow().addFlags(flags);
}

Vous pouvez utiliser ce code pour le conserver jusqu'à ce que le verrouillage de réveil soit désactivé.

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

private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;

@Override
public void onCreate() {
super.onCreate();
    mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Service");
}

private void acquireWakeLock() {
    try {
        mWakeLock.acquire();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

private void releaseWakeLock() {
    try {
        mWakeLock.release();
    }
    catch (Exception e) {

    }
}
1
Bojan Kseneman