Разбудить Android-устройство вверх - PullRequest
35 голосов
/ 01 сентября 2010

Эй, мне нужно разбудить спящее устройство Android в определенное время. Есть предложения?

P.S. Проснуться: включить дисплей и, возможно, разблокировать телефон

Ответы [ 7 ]

74 голосов
/ 16 апреля 2012

Чтобы разбудить экран:

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();

Чтобы снять блокировку экрана:

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

И манифест должен содержать:

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

ДляПодробнее о PowerManager см. в документации API: http://developer.android.com/reference/android/os/PowerManager.html

РЕДАКТИРОВАТЬ: этот ответ считается устаревшим.

32 голосов
/ 02 сентября 2010

Лучше всего использовать некоторую подходящую комбинацию этих флагов окна:

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

Если выЕсли вы хотите работать на более старых версиях платформы, которые не поддерживают требуемый флаг (ы), вы можете напрямую использовать блокировки пробуждения и блокировки клавиш ... но этот путь чреват опасностью.

ОДНО ВАЖНОЕ ПРИМЕЧАНИЕ : ваша деятельность должна быть в полноэкранном режиме , чтобы вышеуказанная комбинация флагов работала.В моем приложении я пытался использовать эти флаги с деятельностью, которая не является полноэкранной (тема диалога), и она не работала.Посмотрев документацию, я обнаружил, что эти флаги требуют, чтобы окно было полноэкранным.

8 голосов
/ 28 декабря 2010

Я нашел способ, и он не так уж сложен ... работает на любой версии API.

Вам необходимо использовать метод PowerManager.userActivity(l, false) и зарегистрировать свою активность в качестве широковещательной передачи, полученной для намерения SCREEN_OFF:

В вашей активности OnCreate поместите что-то вроде:

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

Он отключит обработчик через 2 секунды после отключения экрана.

Зарегистрируйте получателя в вашем методе onResume ():

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

Создайте обработчик, подобный приведенному ниже:

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
    }
};

Запрос разрешения в файле манифеста:

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

Не забудьте отменить регистрацию вещательного приемника, когда закончите. Вы можете сделать это, например, в onDestroy () (что не гарантируется)

unregisterReceiver(mReceiver);
Log.i(TAG, "broadcast UNregistred!");
1 голос
/ 21 марта 2019

На более новых устройствах вы должны использовать что-то вроде этого, поскольку упомянутые флаги устарели.

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 только пробуждает устройство, если ранее вызывался сеттер setTurnScreenOn(true).

Я проверил это на своем устройстве Android Pie.

1 голос
/ 21 января 2017

Если вы показываете окно при пробуждении, вы можете легко заставить его работать, добавив несколько флагов в свою деятельность, без использования пробуждения.

@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);
}
0 голосов
/ 12 января 2014
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);

отключит общий ключ и заставит устройство разблокироваться.

0 голосов
/ 01 сентября 2010

Установка будильника программно приведет к пробуждению телефона (воспроизведению звука), и я думаю, что вариант включения дисплея будет там.

Не думаю, что будет открытый API, который автоматически разблокирует телефон.

...