【问题标题】:DevicePolicyManager.lockNow(); doesn't turn off screen when security settings are set to Slide/NoneDevicePolicyManager.lockNow();安全设置设置为幻灯片/无时不关闭屏幕
【发布时间】:2013-08-09 04:54:42
【问题描述】:

用户希望我的应用在使用后关闭屏幕。目前,我通过设备管理员权限和DevicePolicyManager.lockNow() 实现了这一点,如果安全设置设置为 PIN/Pattern/FaceUnlock 等,它可以正常工作。

但是,如果使用 Slide/None,上述命令只会将用户带到主屏幕(或不执行任何操作),这是可以理解的,因为没有什么可以“锁定”。在这种情况下有什么办法可以实现关闭屏幕?如果这很重要,我的应用需要 SDK>=16。

所以我想我的问题是:应用程序如何可靠地关闭屏幕(我没有持有wakelock,我使用的是WindowManager-flags FLAG_TURN_SCREEN_ONonAttachedToWindow())。

我的应用程序的“流程”是:
- 活动由屏幕关闭时的意图启动,显示在屏幕上的键盘保护/开关上方,并带有上述标志
- 用户主动关闭我的活动,我正在调用lockNow()finish(),并且用户希望屏幕关闭。如果用户使用无/滑动锁,这不起作用,而是显示用户的主屏幕

谢谢!

【问题讨论】:

  • 如果您开发系统应用程序(例如使用平台密钥签名),您可以使用goToSleep method of the PowerManager class...
  • 谢谢,dst!不幸的是,这是一个“普通”的应用程序:-/
  • 如果您请求WRITE_SETTINGS,您可以将屏幕超时设置为 1 秒 - android.provider.Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000); 当然,那您搞乱了用户的设置,但我想不通更好的方法来做到这一点。我已经见过可以做到这一点的应用 - NoLED 是最突出的例子。
  • 谢谢,德利安!我将尝试屏幕超时解决方案(并在不久之后将其设置回用户选择的值)。还有像 Screen Off 这样的应用程序可以在任何版本的 Android 上(可靠地)执行此操作,我会尝试再次寻找开源示例。
  • 您愿意发表您的评论作为答案吗,Delyan?你的方法是我最终的做法,对于使用“幻灯片”或“无”系统锁屏的用户来说,这似乎是目前实现这一目标的唯一方法。

标签: android device-admin


【解决方案1】:

我使用 Delyan 的评论来实现这一点:

如果您请求 WRITE_SETTINGS,您可以将屏幕超时设置为 1 秒 - android.provider.Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, 1000);当然,那你搞砸了用户的设置,但我想不出更好的方法来做到这一点。我见过可以做到这一点的应用程序——NoLED 是最突出的例子。

【讨论】:

    【解决方案2】:

    首先请参阅here

    要控制此政策,设备管理员必须具有“强制锁定”标签 在其元数据的“使用政策”部分。

    主叫设备管理员必须请求USES_POLICY_FORCE_LOCK 能够调用这个方法;如果没有,则会出现安全异常 被扔掉。

    根据您获得的代码,here's 很好地解释了您的情况可能出现的问题(当然,此处提供的任何代码都可以使用!)。

    我多次听说,调用两次代码 DevicePolicyManager.lockNow() 可以解决问题,而 here's 是一种方法:

    mDPM = (DevicePolicyManager)getApplicationContext().getSystemService("device_policy");
    Handler handlerUI = new Handler();
          handlerUI.postDelayed(new Runnable() {
              @Override
              public void run() {
                  mDPM.lockNow();
              }
          }, 200);
          finish();
          mDPM.lockNow();
    

    Here我找到了同一件事的更详细的版本:

    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");
    

    希望最后的解决方法能正常工作。

    干杯

    【讨论】:

    • 感谢您的回答。问题在于,如果用户将锁屏设置设置为“无”或“滑动”,lockNow() 方法将不起作用(无论它是否被调用一次或两次)。
    • 是的,我认为这在 4.0 之后无法使用。您能否在旧版本的模拟器或其他设备上(或更好的设备)尝试一下,以便我们证明这个问题?谢谢
    • 啊,好的,谢谢你告诉我。我的应用程序需要 SDK 级别 >=4.0,所以很遗憾,这对我的情况没有帮助,但我会在旧设备上尝试一下,看看是否有问题 :)
    • 是的,这将是一次宝贵的经验,您可以尝试不同的旧版本,以确认测试结果。
    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多