44

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

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

4

8 回答 8

79

唤醒屏幕:

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

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

于 2012-04-16T18:55:03.273 回答
35

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

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

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

一个重要提示:您的活动必须是全屏的,才能使上述标志组合起作用。在我的应用程序中,我尝试将这些标志与非全屏活动(对话框主题)一起使用,但它不起作用。查看文档后,我发现这些标志要求窗口是全屏窗口。

于 2010-09-02T01:09:06.980 回答
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!");
于 2010-12-27T21:32:50.640 回答
2

如果您在醒来时显示一个窗口,您可以通过在您的活动中添加一些标志来轻松地使其工作,而无需使用唤醒锁。

@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);
}
于 2017-01-21T15:59:08.770 回答
2

在较新的设备上,您应该使用类似的东西,因为不推荐使用提到的标志。

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.requestDismissKeyguardsetTurnScreenOn(true)如果之前调用了设置器,则仅唤醒设备。

我在我的 Android Pie 设备上对此进行了测试。

于 2019-03-21T14:38:45.077 回答
2

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);
    }
于 2020-08-11T13:32:54.563 回答
1

以编程方式设置闹钟会唤醒手机(播放声音),我想打开显示屏将是一个选项。

我认为不会有一个公开的 API 会自动解锁手机。

于 2010-09-01T19:48:10.193 回答
1
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);

将关闭通用键盘锁并导致设备解锁。

于 2014-01-12T12:09:32.310 回答