我正在研究一款能够聆听周围声音的Android应用程序,并执行命令。
其中一个命令是唤醒屏幕。
为了达到这个目标,我使用了以下功能,我的服务:
private void wakeupScreen() {
new AsyncTask<Void, Void, Exception>() {
@Override
protected Exception doInBackground(Void... params) {
try {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
fullWakeLock.acquire(); // turn on
try {
Thread.sleep(10000); // turn on duration
} catch (InterruptedException e) {
e.printStackTrace();
}
fullWakeLock.release();
} catch (Exception e) {
return e;
}
return null;
}
}.execute();
}
但是,我对此代码有几个问题:(它运行在服务)
使用SCREEN_BRIGHT_WAKE_LOCK
和FULL_WAKE_LOCK
为deprecated。
AsyncTask和sleep的使用对于以非阻塞方式打开屏幕似乎是一个糟糕的解决方案。
我想知道是否存在更优雅的方式。有什么建议吗?
答案 0 :(得分:1)
启动活动,只是为了在onCreate()
下启用屏幕。
请参阅what is the proper, non-deprecated way to wake up the device?
上的讨论答案 1 :(得分:0)
我正在做以下
WindowManager.LayoutParams params = getWindow().getAttributes();
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;
params.screenBrightness = 1;
getWindow().setAttributes(params);
或试试这个
Window window = this.getWindow();
window.addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(LayoutParams.FLAG_TURN_SCREEN_ON);
答案 2 :(得分:0)
显然,没有优雅的方法来实现这一目标。
对于未来的读者,我将总结我对该问题的3个非优雅解决方案:
以异步方式使用唤醒锁:
private void wakeupScreen() {
new AsyncTask<Void, Void, Exception>() {
@Override
protected Exception doInBackground(Void... params) {
try {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
fullWakeLock.acquire(); // turn on
try {
Thread.sleep(10000); // turn on duration
} catch (InterruptedException e) {
e.printStackTrace();
}
fullWakeLock.release();
} catch (Exception e) {
return e;
}
return null;
}
}.execute();
}
Simulate HOME button click.(类似于解决方案2,无需创建自定义活动,行为略有不同)
我发现第一个解决方案最符合我的需求。