使用带有设备管理员的锁定任务模式时键盘不显示

时间:2018-02-28 15:43:18

标签: android keyboard

在Device Admin中使用锁定任务模式,我似乎无法显示软键盘。

这就是我正在做的事情:

两个应用程序,一个是管理应用程序,另一个是常规用户应用程序。目标是将手机锁定到用户应用程序。这涉及将其设置为home的持久首选活动,使用锁定任务模式和设置锁定任务包。

// In my admin application
private static final String[] PACKAGES = new String[]{
    BuildConfig.APPLICATION_ID,
    "com.android.settings",
    "com.xyz.myapp"
};

final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MAIN);
intentFilter.addCategory(Intent.CATEGORY_HOME);
intentFilter.addCategory(Intent.CATEGORY_DEFAULT);

devicePolicyManager.addPersistentPreferredActivity(adminComponent, intentFilter, componentName);
devicePolicyManager.setLockTaskPackages(adminComponent, PACKAGES);

// In my user app main activity:
startLockTask();

我们的应用程序中有一些工作流需要用户调整Android设置,因此也允许使用设置应用。启用admin(以便启用这两个策略)并重新启动后,手机会立即正确打开我的用户应用程序,并且手机将锁定到单个应用程序。但是,任何EditTexts /文本输入都不会出现键盘。这几乎就像系统试图显示键盘一样,因为后退按钮箭头从“后退”位置(指向左侧)变为“关闭”位置(指向下方)。

我已经尝试了几天试图找出根本原因,但我发现的唯一一件事就是致电

setLockTaskPackages(...)

似乎是锁定任务模式的罪魁祸首。我试图在锁定任务模式下将键盘应用程序添加为允许的包,但这没有任何区别。此外,键盘也无法从其他允许的应用程序(Android设置)打开,因此我不认为这是我的用户应用程序中错误配置的内容。

我在Nexus 5X,Google Pixel和Google Pixel 2上测试了这一点。所有正在运行的股票8.1。

1 个答案:

答案 0 :(得分:1)

我知道自您提出问题以来已经过去了很长时间,但这也许对其他人有所帮助。

查看此处找到的答案:Android 8.1 (API 27) - Keyboard not showing in Kiosk-mode app after reboot 基本上,您不应该执行自己的操作:锁定设备时不要启动锁定任务模式,因为用户可能无法解锁设备

话虽这么说,您可以在所有窗口上设置FLAG_SHOW_WHEN_LOCKED(从API 27起不推荐使用)或FLAG_DISMISS_KEYGUARD(从API 26起不推荐使用)(即使您打开并需要输入对话框),也可以在活动(API 27 +,haven)上调用setShowWhenLocked找不到在对话框上使用此方法的方法。

根据您的业务流程,您可以执行以下操作之一:

  • 在设置设备管理员之前完全禁用键盘锁(设置为“无”)
  • 如果您有权访问所有需要键盘输入的应用程序的源,请在所有窗口上设置适当的标记
  • 当设备锁定时需要键盘输入时(请参阅KeyguardManager.isKeyguardLocked):
    • 致电stopLockTask
    • 使用KeyguardManager.requestDismissKeyguard要求客户解锁设备
    • 一旦设备被解锁(KeyguardDismissCallback.onDismissSucceeded),请调用startLockTask锁定设备
    • 出于安全原因,您应该考虑在退出时锁定设备,并在从锁定屏幕访问敏感功能时要求用户进行身份验证(请参阅KeyguardManager.createConfirmDeviceCredentialIntent和KeyguardManager.isKeyguardSecure)