2010-09-01 3 views
33

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

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

ответ

30

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

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

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

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

+0

У вас есть мысли об альтернативном пути? – Coxer

+0

API-интерфейс KeyguardManager и PowerManager для непосредственного управления ими. Но очень сложно использовать их ... на самом деле, я бы сказал, что их невозможно использовать для такого рода вещей. Это одна из причин, по которой были введены флаги. – hackbod

+1

Это не работает для меня. Я добавил эти флаги в onCreate своей деятельности, вызываемой моим BroadcastReceiver, в свою очередь, вызванным AlarmService. Вызывается код, но экран остается черным. – Yar

0

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

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

+0

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

7

Я нашел способ, и это не так сложно ... работает над любой версией 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" /> 

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

unregisterReceiver(mReceiver); 
Log.i(TAG, "broadcast UNregistred!"); 
+1

По какой-то причине я могу заставить код работать. Я пытаюсь, чтобы служба разблокировала экран, но по какой-то причине он не разблокируется. Должен ли код просыпаться и разблокировать телефон через 2 секунды? Используя код выше, телефон просто блокируется после того, как я заблокирую его. – Nick

+0

Проблема происходит после блокировки телефона. Экран OFF Log.V показывает, а затем говорит о сдаче экрана -> Просыпайтесь по телефону и отключите клавиатуру. Затем он сидит около 30 секунд, а затем говорит: «Close() никогда не вызывалось явным образом в базе данных» – Nick

+0

Я получаю 'Unresolved reference: userActivity' – crgarridos

69

Проснуться экран:

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: этот ответ сообщается как устаревший.

+2

Просьба предложить, где добавить этот код. –

+1

Верхние 2 блока кода переходят в onCreate() Activity. Нижний блок кода, очевидно, переходит к манифесту Android. – Yar

+0

Спасибо Яру. Эти работы отлично. –

0
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD); 

уволит общую блокировку клавиатуры и привести устройство для разблокировки.

1

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

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