- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个视频通话应用程序,我有一个“来电”屏幕,当有人调用他们时会提醒用户。此屏幕是由传入的 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/
我对 Android 很陌生,如果问题重复,请避免并发送链接。有三个 Activity A、B 和 C。 Activity A 获取一个用户名,我想在 Activity C 中显示该用户名,但我想先运
我正在尝试制作记事本应用程序,因此每次打开新笔记时,布局都会相同。另外, Activity 的数量(新注释)不应定义得尽可能多 最佳答案 如果 Activity 始终相同,您可能应该创建一个适配器,允
我有 3 个 Activity 。 主窗口 5 个按钮 在按钮的主窗口中按下此窗口打开(将其称为父窗口) 在父窗口按钮上按下此窗口打开调用它作为结束子窗口。 现在从子窗口我从父窗口获取值如下:
我遇到了一个 Activity backstack 问题。假设我的后台有 5 个 Activity :比如 Activity A、 Activity B、 Activity C、 Activity D
我正在寻找必须具有以下附加特征的 JMS 提供程序: 采用多代理,所有代理都必须处于事件状态(无单点故障) 仅在两台机器上进行扩展就足以满足我们的需求 能够保证订购(如果 1 个生产者 + 1 个消费
假设,我有一个由 TabHost 组成的选项卡 Activity 。 TabHost 包含 2 个选项卡,每两个选项卡都有一个 Activity 组。每个 Activity 组包含一项 Activit
我正在开发一个应用程序,我需要根据某些操作导航到特定 Activity 。这是一张图片 我的第一个 Activity 是 ReadingActivity。基于某些操作,用户将被带到 NewProjec
我创建了一个与服务器异步通信的应用程序。当应用程序发出服务器请求时,将创建一个带有“正在加载”通知的新对话框( Activity )。主要 Activity 实现了处理服务器响应的方法,我想在主要 A
我想在我的所有应用程序 Activity 中显示相同的选项菜单。我创建了一个实现菜单的通用 Activity ,并且我所有的进一步 Activity 都扩展了它。 问题:当我需要扩展其他特定 Acti
我有四个 Activity ,即 java 文件 - Activity1.java、activity2.java、activity3.java、activity4.java 和 xml 文件 - Ac
我有两个 Activity 。我想将数据从第二个 Activity 发送到上一个 Activity 。第一个 Activity 有自定义 ListView 和 bean 类。当我点击第二个 Activ
根 Activity 是堆栈中当前的第一个 Activity 还是 list 中指定为启动 Activity 的 Activity ? 支持应用程序 P 在启动时启动 Activity A。然后 A
你好 我想知道您在绘制 Activity 图选择“Activity ”时考虑了哪些关键点? 您如何从要建模的问题中选择 Activity ? 谢谢 最佳答案 Activity 图用于对正在开发的系统和
如何从主 Activity 启动 Activity 并在子 Activity 返回主 Activity 中退出操作后返回主 Activity ? 我已将子 Activity 作为启动器 Intent
我的工作流程如下: 登录 Activity -> ActivityB -> ActivityC -> ActivityD 我想将数据从LoginActivity传递到ActivityD,但不直接传递到
我之前曾尝试获得此问题的答案,但找不到可以解决我的问题的答案。我正在制作保存圆盘高尔夫球分数的应用程序。我的 MainActivity 有 4 个按钮。新比赛、恢复比赛、类(class)和球员。 At
我有一个 tts 非 UI 类和 Activity 类。现在在 Activity 类中,我有一个按钮,用户可以从中选择男声或女声,具体取决于我想要将字符串传递给 tts 类的选择,然后一次tts 类根
问题有点复杂,首先, Activity A 和 Activity B 的 list 中都有 android:noHistory = true 。我有一个自定义 serialized 类,假设 MyCl
在我的应用程序中,我有两个 Activity (AuthenticationActivity 和 MainActivity),每个 Activity 都有一个导航图和大量 fragment 。我创建了
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How can i use compose email activity in tabView? 我想在选项
我是一名优秀的程序员,十分优秀!