用户希望我的应用在使用后关闭屏幕。目前,我使用设备管理员权限和DevicePolicyManager.lockNow()
来实现这一点,如果安全设置设置为PIN/图案/面部解锁等,则可以正常工作。
但是,如果使用 Slide/None,上面的命令只是将用户带到主屏幕(或不执行任何操作(,这是可以理解的,因为没有什么可以"锁定"的。在这种情况下,有什么方法可以实现关闭屏幕吗?我的应用需要 SDK>=16(如果这很重要(。
所以我想我的问题是:应用程序如何可靠地关闭屏幕(我没有拿着wakelock
,我正在使用onAttachedToWindow()
中FLAG_TURN_SCREEN_ON
的WindowManager
标志(。
我的应用程序的"流程"是:
- 活动在屏幕关闭时由意图启动,在屏幕上的键盘锁/开关上方显示上述标志
- 用户主动关闭我的活动,我正在呼叫lockNow()
和finish()
,用户希望屏幕关闭。如果用户使用的是无/滑动锁定,则这不起作用,而是显示用户的主屏幕
谢谢!
首先看这里:
要控制此策略,设备管理员必须具有"强制锁定"标记 在其元数据的"使用策略"部分中。
呼叫设备管理员必须已请求USES_POLICY_FORCE_LOCK 能够调用此方法;如果没有,则安全异常将 被扔掉。
根据您获得的代码,这里有一个很好的解释,说明您的情况可能出错(当然,此处提供的任何代码都会有用!
我多次听说,调用两次代码DevicePolicyManager.lockNow()
就可以解决问题,这里有一种方法可以做到这一点:
mDPM = (DevicePolicyManager)getApplicationContext().getSystemService("device_policy");
Handler handlerUI = new Handler();
handlerUI.postDelayed(new Runnable() {
@Override
public void run() {
mDPM.lockNow();
}
}, 200);
finish();
mDPM.lockNow();
在这里,我找到了同一件事的更详细的版本:
Android DevicePolicyManager lockNow() problem
public class SMSMessagingActivity extends Activity {
/** Called when the activity is first created. */
public static DevicePolicyManager mDPM;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
}
public static void LockNow(){
mDPM.lockNow();
}
}
ComponentName devAdminReceiver; // this would have been declared in your class body
// then in your onCreate
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
devAdminReceiver = new ComponentName(context, deviceAdminReceiver.class);
//then in your onResume
boolean admin = mDPM.isAdminActive(devAdminReceiver);
if (admin)
mDPM.lockNow();
else Log.i(tag,"Not an admin");
让我们希望最后一个解决方法能够正常工作。
干杯
我使用了Delyan的评论来实现这一点:
如果您请求WRITE_SETTINGS,则可以将屏幕超时设置为 1 秒 - android.provider.Settings.System.putInt(getContentResolver((, Settings.System.SCREEN_OFF_TIMEOUT, 1000(;当然,那么你会搞砸用户的设置,但我想不出更好的方法。我见过这样做的应用程序 - NoLED是最突出的例子。