web-dev-qa-db-fra.com

Wake Android Device up

Hé, je dois réveiller mon sommeil Android appareil à un certain moment. Des suggestions?

P.S. Réveillez-vous: allumez l'écran et peut-être déverrouillez le téléphone

36
Coxer

Le mieux est d'utiliser une combinaison appropriée de ces drapeaux de fenêtre:

http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_DISMISS_KEYGUARD
http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED
http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON
http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_TURN_SCREEN_ON

Si vous souhaitez exécuter des versions plus anciennes de la plate-forme qui ne prennent pas en charge les indicateurs souhaités, vous pouvez directement utiliser des verrous de réveil et des verrous de verrouillage ... mais ce chemin est semé d'embûches.

UNE NOTE IMPORTANTE : Votre activité doit être en plein écran pour que le au-dessus de la combinaison de drapeaux pour fonctionner. Dans mon application, j'ai essayé d'utiliser ces drapeaux avec une activité qui n'est pas en plein écran (Dialog Theme) et cela n'a pas fonctionné. Après avoir regardé la documentation, j'ai constaté que ces indicateurs nécessitent que la fenêtre soit une fenêtre plein écran.

32
hackbod

Pour réveiller l'écran:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();

Pour déverrouiller l'écran:

KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();

Et le manifeste doit contenir:

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

Pour plus de détails sur PowerManager, reportez-vous à la documentation de l'API: http://developer.Android.com/reference/Android/os/PowerManager.html

EDIT: cette réponse est signalée comme obsolète.

73
Yar

J'ai trouvé un moyen et ce n'est pas si complexe ... fonctionne sur n'importe quelle version d'API.

Vous devez utiliser la méthode PowerManager.userActivity(l, false) et enregistrer votre activité en tant que diffusion reçue pour l'intention SCREEN_OFF:

Dans votre activité, OnCreate a mis quelque chose comme:

mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(TAG, "Screen OFF onReceive()");
        screenOFFHandler.sendEmptyMessageDelayed(0, 2000L);
    }
};

Il démarrera le gestionnaire après 2 secondes d'événement Screen Off.

Enregistrez le récepteur dans votre méthode onResume ():

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);
Log.i(TAG, "broadcast receiver registered!");

Créez un gestionnaire comme celui ci-dessous:

private Handler screenOFFHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        super.handleMessage(msg);
        // do something
        // wake up phone
        Log.i(TAG, "ake up the phone and disable keyguard");
        PowerManager powerManager = (PowerManager) YourActivityName.this
                .getSystemService(Context.POWER_SERVICE);
        long l = SystemClock.uptimeMillis();
        powerManager.userActivity(l, false);//false will bring the screen back as bright as it was, true - will dim it
    }
};

Demandez l'autorisation dans votre fichier manifeste:

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

N'oubliez pas de désenregistrer le récepteur de diffusion lorsque vous avez terminé. Vous pouvez le faire dans onDestroy () par exemple (ce qui n'est pas garanti)

unregisterReceiver(mReceiver);
Log.i(TAG, "broadcast UNregistred!");
7
mishkin

Sur les appareils plus récents, vous devriez utiliser quelque chose comme ça, car les indicateurs mentionnés sont obsolètes.

class AlarmActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_alarm)

        // Keep screen always on, unless the user interacts (wakes the mess up...)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

        setTurnScreenOn(true)
        setShowWhenLocked(true)

        (getSystemService(KeyguardManager::class.Java) as KeyguardManager).requestDismissKeyguard(this,
            object: KeyguardManager.KeyguardDismissCallback(){
                override fun onDismissCancelled() {
                    Log.d("Keyguard", "Cancelled")
                }

                override fun onDismissError() {
                    Log.d("Keyguard", "Error")
                }

                override fun onDismissSucceeded() {
                    Log.d("Keyguard", "Success")
                }
            }
        )
    }
}

KeyguardManager.requestDismissKeyguard Ne réveille l'appareil que si le setter setTurnScreenOn(true) a été appelé auparavant.

J'ai testé cela sur mon Android Pie.

1
Palm

Si vous affichez une fenêtre au réveil, vous pouvez la faire fonctionner facilement en ajoutant quelques indicateurs à votre activité, sans utiliser de verrouillage de réveil.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
1
Lahiru Chandima
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);

annulera le verrouillage du clavier général et provoquera le déverrouillage de l'appareil.

0
Prativa

Régler une alarme par programme réveillera le téléphone (émettra un son) et je suppose que l'affichage allumé serait une option.

Je ne pense pas qu'il y aurait une API exposée qui déverrouillera automatiquement le téléphone.

0
schar