Разбудите Android-устройство

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

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

6 ответов


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

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

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

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


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

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

EDIT: этот ответ сообщается как устаревший.


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

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

в actiivity метод 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!");

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

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

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

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


getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);

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