【问题标题】:How to lock Android device after unlocking with setShowWhenLocked(true);使用 setShowWhenLocked(true) 解锁后如何锁定 Android 设备;
【发布时间】:2020-03-26 21:36:48
【问题描述】:

我正在创建一个视频通话应用程序,并且当应用程序收到推送通知时调用以下代码 - 它解锁屏幕并显示“来电”用户界面:

public class MainActivity extends ReactActivity {

  @Override
  protected String getMainComponentName() {
    return "x";
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
      setShowWhenLocked(true);
      setTurnScreenOn(true);
    }
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
  }
}

当有来电时,这可以正常工作 - 用户可以使用呈现的 UI 与应用程序交互。但是,问题是如果应用程序在前台,然后手机被锁定,当按下手机侧面的解锁按钮时,会显示应用程序,而不是显示键盘锁/锁定屏幕。如果应用程序位于前台并且手机已锁定并按下解锁按钮,则它永久允许访问该应用程序。

我希望应用程序在收到推送通知并且屏幕被锁定时出现,但我也希望用户能够完全锁定设备,并且在按下锁定按钮后不授予用户访问应用程序的权限.

我怎样才能做到这一点?

【问题讨论】:

    标签: java android react-native


    【解决方案1】:

    据我所知,该问题的最佳解决方案是进行多种类型的活动。

    在第一个活动(调用活动)中,您将 setShowWhenLocked 和 setTurnScreenOn 设置为 true(就像您所做的那样)。
    当有来电时,您启动处理呼叫的呼叫活动,因为您设置了这两个属性,即使设备被锁定,活动也会显示给用户。
    此外,当通话活动处于活动状态时,用户将能够“锁定”他的设备(即按下电源按钮),当他解锁时,他将再次看到通话活动(无需输入代码)。
    这与大多数默认的 Android 呼叫/电话应用程序的行为相同。

    第二个活动用于您的其他逻辑,只有当用户真正解锁他的手机时才能访问。 (即输入代码)
    因此,当电话结束时,您从呼叫活动开始第二个活动,例如像这样:

     Intent intent = new Intent(this, SecondActivity.class);
     this.startActivity(intent);
    

    this 是调用活动的实例

    如果手机之前被锁定,则刚刚启动的SecondActivity 将自动锁定在锁屏后面(即无法解锁)。

    我刚刚在一个小型测试项目中测试了这种行为,如果您需要进一步的帮助,请询问。

    【讨论】:

    • 非常感谢!终于有人回复了!! :) 我是一名使用 React Native 的 JavaScript 开发人员,并且启动并运行了这个 Java 模块,这在 React Native 中被称为Native.Module。因此,您是否介意分享小型测试项目的代码来帮助我尝试实现它,因为我的 Java 技能很少?非常感谢!
    • 我在这里上传了一个小的Java示例项目:drive.google.com/file/d/1t1hausmnkEOYCi66WT0Obwm-KbSN8tm5/…对于这个测试项目,我使用广播接收器在设备屏幕锁定时进行监听,然后启动10秒延迟(模拟在手机被锁定时的某个时间点拨打电话)然后启动“CallingActivity”当您按下呼叫活动上的按钮时,SecondActivity 会启动(在锁定屏幕后)这对您有帮助吗?
    • 谢谢 - 我会实施并报告。
    • @Mr.Robot 你有时间看看吗?你明白这个例子了吗?
    • 嗨@Lukas Major,是的,我已经查看了您的项目,并且可以看到该项目有效,因此已标记为正确答案。不过,我还没有在我自己的应用程序中实现它,但很快就会这样做 - 再次感谢!
    【解决方案2】:

    在我的 VoIP 应用程序 (baresip) 中,我通过在按下电源按钮解锁设备时调用 requestDismissKeyguard() 函数解决了这个问题。这可以通过使用 IntentFilter(Intent.ACTION_SCREEN_ON) 注册广播接收器来检测。然后,如果设备被安全键盘锁锁定,requestDismissKeyguard() 将在用户访问应用程序之前要求输入 PIN 码或密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-12
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多