唤醒Android设备
嘿,我需要在特定的时间唤醒我的睡眠机器人。 有什么build议么?
PS唤醒:打开显示,也许解锁手机
最好的是使用这些窗口标志的一些适当的组合:
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
如果您希望在不支持所需标志的旧版平台上运行,则可以直接使用唤醒锁和键盘锁…但这条路线充满了危险。
一个重要提示 :为了使上述标志组合起作用,您的活动必须全屏 。 在我的应用程序,我试图使用这些标志与不是全屏(对话框主题)的活动,它没有工作。 在查看文档后,我发现这些标志要求窗口是全屏窗口。
唤醒屏幕:
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();
释放屏幕locking:
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
编辑:这个答案被报告为已弃用。
我find了一种方法,它不是那么复杂…适用于任何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); } };
在屏幕closures事件2秒后,它将启动处理程序。
在你的onResume()方法中注册接收者:
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(mReceiver, filter); Log.i(TAG, "broadcast receiver registered!");
创build一个如下所示的处理程序:
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!");
以编程方式设置闹钟会唤醒手机(播放声音),我猜想显示屏会是一个选项。
我不觉得会有一个暴露的API,将自动解锁手机。
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
将解除一般键盘锁并导致设备解锁。
如果您在醒来时显示一个窗口,则可以通过向活动添加less许标志而轻松地工作,而不使用唤醒锁。
@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); }