12

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

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

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

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

谢谢!

4

2 回答 2

5

首先看这里

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

调用设备管理员必须请求 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");

让我们希望最后的解决方法能够正常工作。

干杯

于 2013-08-14T11:12:55.897 回答
0

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

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

于 2013-08-22T10:49:07.353 回答