gpt4 book ai didi

android - 使用 noHistory ="true"和/或 showOnLockScreen ="true"从 Activity 请求 Android M 权限

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:13 26 4
gpt4 key购买 nike

我正在开发一个视频通话应用程序,我有一个“来电”屏幕,当有人调用他们时会提醒用户。此屏幕是由传入的 GCM 触发的 Activity ,并在 list 中设置了 noHistory="true"和 showOnLockScreen="true",以便用户无需解锁设备即可参与通话。

如果用户选择接听电话,我将启动另一个 Activity 以进行实际通话。但是,在启动第二个 Activity 之前,我会检查是否存在必要的权限(摄像头、麦克风等),如果没有则请求它们。

这就是问题所在。

问题 1:

系统显示的权限请求对话框导致我的 Activity 进入 onPause。我相信,因为在幕后这个对话实际上是一个 Activity 。

因为一个新的 Activity 在这里启动,使用 noHistory="true"意味着我们的 Activity 被立即杀死。从技术上讲,这是有意为之的行为,Android 团队确实已将此问题排除在外:

https://code.google.com/p/android-developer-preview/issues/detail?id=2915

我可以通过在 onPause 中手动管理它并检测是否有任何未完成的权限请求正在运行等来解决这个问题。

问题 2:解决问题 1 后,我进入阶段 2。

现在请求权限时,我的 Activity 不再被终止,但设备只是返回到锁定屏幕,我没有看到权限对话框。

如果我随后解锁设备,万岁,我会看到我的 Activity 和请求权限对话框覆盖在顶部。这种用户体验是不愉快的。

视频在这里:https://youtu.be/cobINQ9e2GY

我猜测请求权限的 Activity 没有将 showOnLockScreen 属性设置为 true,因此如果它在屏幕锁定的情况下启动,它不会显示。

那么,一个大问题,我们能否从允许在锁定屏幕上显示的 Activity 中优雅地请求权限?

我的直觉是不,我们不能在不快速回到锁定屏幕的情况下显示权限对话框。但是,我可以接受的妥协是提示用户解锁设备/即显示 pin 输入屏幕。

那么,问题 2:

我们能否以编程方式从屏幕锁定时显示的 Activity 中显示 pin 解锁屏幕?

最佳答案

来自 requestPermission() (ActivityCompat) 的文档:

This method may start an activity allowing the user to choose which permissions to grant and which to reject. Hence, you should be prepared that your activity may be paused and resumed. Further, granting some permissions may require a restart of you application. In such a case, the system will recreate the activity stack before delivering the result to your onRequestPermissionsResult( int, String[], int[]).

我最终创建了一个状态变量来处理这个问题,这样 onPause() 和 onResume() 就可以区分是由于权限请求而被调用还是由于其他系统事件而被调用。

所以像这样:

private final int STATE_STARTING = 0;
private final int STATE_RUNNING = 1;
private final int STATE_REQUESTING_FINE_LOCATION_PERMISSION = 2;

private int state = STATE_STARTING;

@Override
public void onCreate() {
super.onCreate();
switch (state) {
case STATE_STARTING:
// do your initialization
state = STATE_RUNNING;
break;
}
}

@Override
public void onResume() {
super.onResume();
switch (state) {
case STATE_RUNNING:
// handle other system events
break;
case STATE_REQUESTING_FINE_LOCATION_PERMISSION:
// handle permission request event
break;
}
}

@Override
public void onPause() {
super.onPause();
switch (state) {
case STATE_RUNNING:
// handle other system events
break;
case STATE_REQUESTING_FINE_LOCATION_PERMISSION:
// handle permission request event
break;
}
}

private void someFunction() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
state = STATE_REQUESTING_FINE_LOCATION_PERMISSION;
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION_FINE_LOCATION);
} else {
doProcessingRequiringFineLocationPermission();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_PERMISSION_FINE_LOCATION:
if (grantResults != null && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doProcessingRequiringFineLocationPermission();
}
state = STATE_RUNNING;
break;
}
}

关于android - 使用 noHistory ="true"和/或 showOnLockScreen ="true"从 Activity 请求 Android M 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35151233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com