我正在创建一个视频通话应用程序,并具有以下代码,当该应用程序收到推送通知时会被调用-它解锁屏幕并显示“来电”用户界面:
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与应用进行交互。但是,问题在于,如果应用程序位于前台,然后锁定了电话,则在电话侧面按下解锁按钮时,将显示该应用程序,而不是显示键盘锁/锁定屏幕。如果它在前台并且手机已锁定并且按下了解锁按钮,它将永久允许访问该应用程序。
我希望应用在收到推送通知且屏幕锁定时显示,但我也希望用户能够完全锁定设备,并且在按下锁定按钮后不让用户访问该应用。
我该如何实现?
答案 0 :(得分:1)
据我所知,解决该问题的最佳方法是进行多种活动。
在第一个活动(调用活动)中,将setShowWhenLocked和setTurnScreenOn设置为true(就像您所做的那样)。
呼叫进入后,您将启动处理呼叫的呼叫活动,因为您设置了这两个属性,即使设备已锁定,该活动也会显示给用户。
此外,在通话活动处于活动状态时,用户将能够“锁定”他的设备(即按下电源按钮),并且当他解锁时,将再次向他显示通话活动(无需输入代码)。 />
这与大多数默认的android呼叫/电话应用程序具有相同的行为。
第二个活动用于您的其他逻辑,仅当用户真正解锁手机时才可以访问。 (即输入代码)
因此,当电话结束时,您可以从呼叫活动中开始第二个活动,例如像这样:
Intent intent = new Intent(this, SecondActivity.class);
this.startActivity(intent);
其中this
是呼叫活动的实例
如果之前已锁定电话,那么刚启动的SecondActivity
将自动锁定在锁定屏幕后面(即,如果没有解锁,则无法访问)。
我只是在一个小型测试项目中测试了此行为,如果您需要进一步的帮助,请询问。