Android Marshmallow:在运行时更改权限会导致应用程序崩溃

2024-03-12

Marshmallow 重新设计了获取权限。因此,在调用需要权限的方法之前处理权限并且工作正常,但在以下情况下会崩溃:

第 1 步:打开应用程序并授予所有必要的权限

第 2 步:单击“主页”按钮(因此应用程序处于后台)

第 3 步:在“设置”中手动更改权限

步骤 4:从多任务启动应用程序,现在由于应用程序上下文无效而崩溃

观察到应用程序再次创建,不明白为什么会发生这种情况。欢迎提出纠正此问题的任何建议!


这是因为 Marshmallow 添加了额外的功能。您需要在运行时向用户请求。为此,请使用我制作的这个课程。然后在需要的地方使用它

public class AppPermission {

    public static boolean isMarshmallowPlusDevice() {
        return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1;
    }

    @TargetApi(Build.VERSION_CODES.M)
    public static boolean isPermissionRequestRequired(Activity activity, @NonNull String[] permissions, int requestCode) {
        if (isMarshmallowPlusDevice() && permissions.length > 0) {
            List<String> newPermissionList = new ArrayList<>();
            for (String permission : permissions) {
                if (PackageManager.PERMISSION_GRANTED != activity.checkSelfPermission(permission)) {
                    newPermissionList.add(permission);
                }
            }
            if (newPermissionList.size() > 0) {
                activity.requestPermissions(newPermissionList.toArray(new String[newPermissionList.size()]), requestCode);
                return true;
            }
        }
        return false;
    }
}

然后将此代码放在需要用户许可的位置。

if (!AppPermission.isPermissionRequestRequired(SignInActivity.this, new String[]{"android.permission.GET_ACCOUNTS"},
        REQUEST_APP_PERMISSION)) {
    // Your code if permission available
}

此后,在您的Fragment or Activity把这个代码-

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_APP_PERMISSION:
            for (int i = 0; i < permissions.length; i++) {
                String permission = permissions[i];
                int grantResult = grantResults[i];
                switch (permission) {
                    case "android.permission.GET_ACCOUNTS":
                        if (PackageManager.PERMISSION_GRANTED == grantResult) {
                            // Your code
                        }
                        break;
                }
            }
            break;
    }
}

上面的代码用于请求权限GET_ACCOUNTS您可以将其更改为任何需要的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Marshmallow:在运行时更改权限会导致应用程序崩溃 的相关文章

随机推荐

  • 可以多次访问顶点的 TSP

    我正在寻求解决一个问题 其中我有一个加权有向图 并且必须从原点开始 至少访问所有顶点一次并以尽可能最短的路径返回原点 本质上 这将是 TSP 的一个经典示例 除了我DO NOT具有每个顶点只能被访问一次的约束 在我的例子中 除了原点之外的任
  • 使用 PHP 和 AJAX 保持套接字连接打开

    我正在尝试连接到一个服务器套接字 该套接字将在连接后向我发送一堆数据 从我那里获取响应 然后发送更多数据 重复此过程 直到确定它已经足够了 所以基本上 在第一次连接之后 我们将 并且当前正在 从服务器接收数据 我们想要获取这些数据 在另一个
  • 计算 ISBN 的校验位

    这实际上不是家庭作业 我只是在下周开始计算机科学之前浏览一本离散数学书中的一些问题 不管怎样 其中一个问题要求我编写一个程序来执行这个算法 它解释了 我所困惑的部分是如何获取 9 位数字并将其 拆分 为单个整数 以便可以对每个数字执行计算
  • 如何在 gdb 中使用 python 访问寄存器

    如何访问当前调试实例的cpu寄存器 例如 您可以从 gdb 调用printf 0x x eax and set eax b eax还有一种方法可以通过 gdb 提供的 python 支持来做到这一点吗 或者我应该创建一个可以像这样调用的 p
  • Android:如何更改操作栏背景颜色? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的 Android 应用程序的颜色是黑色 我想把它改成其他颜色 最简单的方法是什么 我尝试以此为主题 当应用程序打开时 我可以看到操作栏
  • 你能帮我写一个可以自行打印的短代码吗?

    define q k main return puts k nq k q define q k main return puts k nq k 这段代码可以在屏幕上打印出来 但是 我读起来有困难 尤其是那两个 K 它是如何工作的 我知道 d
  • Jooq 将 String 转换为 BigDecimal

    有没有办法在 jooq 查询中将 String 转换为 BigDecimal 而不丢失精度 当我做endResER VALUE cast BigDecimal class where VALUE是数据库中具有字符串值的字段 它返回不带任何小
  • 打印 GUID 变量

    我有一个 GUID 变量 我想在文本文件中写入其值 GUID的定义是 typedef struct GUID size is 16 DWORD Data1 WORD Data2 WORD Data3 BYTE Data4 8 GUID 但我
  • JTextArea 和 JTextField 文本内部填充

    我想增加间距 填充 插入文本字段 http java sun com j2se 1 5 0 docs api javax swing JTextField html and J文本区 http java sun com j2se 1 5 0
  • plpgsql - pgAdmin 4 不显示 RAISE 消息(例如,通知)

    在使用 pgAdmin III 很长一段时间后 我最近安装了 pgAdmin 4 我注意到在使用 RAISE NOTICE 运行 plpgsql 函数后 消息下没有显示任何内容 我去了https www postgresql org doc
  • 使用 Java API 下载 YouTube 视频?

    我在 Stack Overflow 中发现了类似的问题 并尝试了一些解决方案 所有这些都已经过时了 所以我提出了一个新问题 我跟随并尝试 如何在java上从youtube下载视频 https stackoverflow com questi
  • 如何使用 php shell_exec 和 sql 命令行创建数据库

    我正在尝试使用 shell exec 和 mysql 命令创建数据库 由于几个原因 我不想使用 php 内置的 mysql query 但是 我无法让以下命令成功执行 任何人都可以告诉我出了什么问题吗 test shell exec mys
  • 由于“TIMESTAMP withimplicit DEFAULT value is deprecated”错误,我无法启动 Mysql 5.6 服务器? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 好的 这是我的故事 我访问 mysql com 网站并下载了文件mysql 5 6 11 winx64 zip进入C 然后我解压它 然后我进入 bin
  • 是否有软件可以将大量小数字图像拼接在一起而无需旋转或拉伸它们? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有大量小图像 360x192 这些小图像是从 DOS 2D 电脑游戏中按顺序截取的 它们有相当大的重叠 我想将它们缝合在一起形成一个大的复合材料 由
  • 自动反序列化为 Web.API 控制器中的类似字符串的类

    我有一个 Web API 端点 它将这样的对象作为参数 public class Person public string FirstName get set public string LastName get set public in
  • Android 应用程序客户端与 java 服务器的双向 TLS

    我正在尝试使用双向 TLS 向我的服务器发送 https 请求 我使用 TLS 成功运行的服务器 但我不知道如何在客户端 Android 应用程序 上执行此操作 我在java服务器上使用spring 来自 Android 应用程序的请求是使
  • 如何附加或更新时间戳查询字符串参数

    我想在我的查询字符串中附加一个时间戳 以确保当我通过 JavaScript 刷新页面时浏览器绕过其缓存 我需要考虑现有的查询字符串 其中可能已经有时间戳参数 和哈希标签 http www example com ts 123456 exam
  • 以有效的方式将哈希表转换回字符串数据

    我正在尝试以有效的方式将哈希表转换回键值对 目前我正在使用这个 kv hash GetEnumerator ForEach kv Name Value 有没有办法直接将哈希表转换为键值对 或者我的意思是字符串数据 有ConvertFrom
  • Java 增量流式 JSON 库

    谁能推荐一个 Java 的 JSON 库 它允许我以非阻塞的方式提供传入的数据块 我已读完更好的 Java JSON 库 https stackoverflow com questions 338586 a better java json
  • Android Marshmallow:在运行时更改权限会导致应用程序崩溃

    Marshmallow 重新设计了获取权限 因此 在调用需要权限的方法之前处理权限并且工作正常 但在以下情况下会崩溃 第 1 步 打开应用程序并授予所有必要的权限 第 2 步 单击 主页 按钮 因此应用程序处于后台 第 3 步 在 设置 中