嘿,我需要在某个时间唤醒我睡觉的Android设备。 有什么建议吗?
P.S。醒来:打开显示器并可能解锁手机
答案 0 :(得分:74)
唤醒屏幕:
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
编辑:此答案报告为已弃用。
答案 1 :(得分:32)
最好是使用这些窗口标志的一些适当组合:
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
如果你想在不支持所需标志的平台的旧版本上运行,你可以直接使用唤醒锁和键盘锁...但这条路充满了危险。
一个重要提示:您的活动必须全屏才能使上述标记组合正常工作。在我的应用程序中,我试图使用这些标志与不是全屏幕的活动(对话框主题),它不起作用。在查看文档后,我发现这些标志要求窗口是一个全屏窗口。
答案 2 :(得分:8)
我找到了一种方法,它并不复杂......适用于任何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!");
答案 3 :(得分: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);
}
答案 4 :(得分:0)
以编程方式设置闹钟将唤醒手机(播放声音),我猜开启显示将是一个选项。
我不认为会有一个暴露的API会自动解锁手机。
答案 5 :(得分:0)
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
将关闭通用键盘锁并使设备解锁。
答案 6 :(得分:0)
在较新的设备上,您应该使用类似这样的名称,因为已弃用了上述标志。
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
仅在之前调用setter setTurnScreenOn(true)
时唤醒设备。
我在Android Pie设备上对此进行了测试。
答案 7 :(得分:0)
在活动setContentView(R.layout.YOUR_LAYOUT);
方法的onCreate()
之后尝试以下代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
Log.d(TAG, "onCreate: set window flags for API level > 27");
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);
keyguardManager.requestDismissKeyguard(this, null);
setShowWhenLocked(true);
setTurnScreenOn(true);
} else {
Log.d(TAG, "onCreate: onCreate:set window flags for API level < 27");
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}