唤醒Android设备

Cox*_*xer 40 android wakeup

嘿,我需要在某个时间唤醒我的睡眠安卓设备.有什么建议?

PS唤醒:打开显示器并可能解锁手机

Yar*_*Yar 76

要唤醒屏幕:

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();
Run Code Online (Sandbox Code Playgroud)

要释放屏幕锁定:

KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
Run Code Online (Sandbox Code Playgroud)

清单需要包含:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
Run Code Online (Sandbox Code Playgroud)

有关PowerManager的更多详细信息,请参阅API文档:http://developer.android.com/reference/android/os/PowerManager.html

编辑:此答案报告为已弃用.

  • 谢谢"Yar".BTW在印度,这位朋友被称为Yar.谢谢我的朋友.它帮助了很多. (3认同)
  • 现在不推荐使用`SCREEN_BRIGHT_WAKE_LOCK`和`FULL_WAKE_LOCK`.建议使用`FLAG_KEEP_SCREEN_ON`(参见选定的答案). (2认同)
  • 谢谢你.KeyguardLock和WakeLock在较新版本的Android中已被弃用,建议使用窗口标志,但我需要从没有活动或窗口的服务应用程序唤醒和解锁屏幕,因此您的解决方案就是我所需要的. (2认同)

hac*_*bod 33

最好是使用这些窗口标志的一些适当组合:

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

如果您想在不支持所需标志的旧版本平台上运行,您可以直接使用唤醒锁和键盘锁......但这条路充满了危险.

一个重要说明:您的活动必须全屏,以便上述标志组合起作用.在我的应用程序中,我试图使用这些标志与不是全屏幕的活动(对话框主题),它不起作用.在查看文档后,我发现这些标志要求窗口是一个全屏窗口.


mis*_*kin 7

我找到了一种方法,它并不复杂......适用于任何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);
    }
};
Run Code Online (Sandbox Code Playgroud)

它将在屏幕关闭事件2秒后启动处理程序.

在onResume()方法中注册接收器:

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

创建一个如下所示的处理程序:

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
    }
};
Run Code Online (Sandbox Code Playgroud)

请求清单文件中的权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />
Run Code Online (Sandbox Code Playgroud)

完成后不要忘记取消注册广播接收器.你可以在onDestroy()中做到这一点(不保证)

unregisterReceiver(mReceiver);
Log.i(TAG, "broadcast UNregistred!");
Run Code Online (Sandbox Code Playgroud)