• 「踩坑记」Android API 判断权限申请结果的闪退问题


    这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题。权限的申请使用的语句为:

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);

    其中MY_PERMISSIONS_REQUEST_SEND_SMSjava为申请的一个int型的变量,用于指代权限代码,相比数字更易于程序维护。

    为了判断程序是否已拥有某种权限,可以使用以下方法:

    if (ActivityCompat.checkSelfPermission(this,
                    Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);
        } else {
    
    }

    使用上述语句即可完成权限的申请。但为了判断用户是否同意了该权限,需要使用onRequestPermissionsResult接口来判断。问题就出在这里,按照之前的写法写出后会在弹出权限的申请后立马闪退。

    if (ActivityCompat.checkSelfPermission(this,
                    Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, MY_PERMISSIONS_REQUEST_SEND_SMS);
        } else {
    
    }

    经排查发现使用这种情况会在判断grantResults[0] == PackageManager.PERMISSION_GRANTED这一语句的时候出现数组非法的情况。这是因为用户还没有对弹出的权限对话框做出选择,但该事件已经被触发,此时的grantResult是一个空数组,判断他的第一个元素是否为1就会出现exception:

    https://billc.io/wp-content/uploads/2019/01/image-7-1600x728.png

    对于使用switch语句的另一种写法也可能出现类似情况。
    这里的解决方案是将条件判断改为grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED,增加一个对grantResult的长度判断,排除空数组的情况,即可正常处理用户的反馈。可以使用以下语句:

    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            if (requestCode == MY_PERMISSIONS_REQUEST_SEND_SMS) {
                if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission Granted
                    
                } else if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
                    // Permission Denied
    
                } else {
                    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                }
            }
    
        }

    此后即可正常处理后续事件。

    https://billc.io/wp-content/uploads/2019/01/image-10.png

    由于在Android API 6.0之后不能再像以前一样,在AndroidManifest.xml里加上权限即可使用相关权限,只能通过动态的方式申请权限,关于这一部分的更多使用可以参考Google官方给出一个动态权限申请的实例文档:https://github.com/googlesamples/android-RuntimePermissions

    来源:https://billc.io/2019/01/android-request-permission-issue/

  • 相关阅读:
    获取本机IP地址[JavaScript / Node.js]
    python 优雅的解析 jsonp
    Ext.jsTree 向子节点添加叶子节点
    LeetCode面试题 08.05. 递归乘法:A * B 就是B个A相加
    LeetCode第235题:二叉搜索树的最近公共祖先——到两个点路径交集的最后一个元素
    InvalidMongoDbApiUsageException之重复的字段条件
    leetcode第6题:Z字形变换--直接模拟求解法
    Arch Linux 安装指南
    从Windows文件夹到Linux分区
    华为 服务器 存储相关资料
  • 原文地址:https://www.cnblogs.com/AlanChen2k/p/android-request-permission-issue.html
Copyright © 2020-2023  润新知