博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「踩坑记」Android API 判断权限申请结果的闪退问题
阅读量:4925 次
发布时间:2019-06-11

本文共 2085 字,大约阅读时间需要 6 分钟。

这几天尝试着用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://www.cnblogs.com/BillChen2000/p/android-request-permission-issue.html

你可能感兴趣的文章
ural 1519 Formula 1(插头dp)
查看>>
序列化和反序列化
查看>>
Web服务器Nginx多方位优化策略
查看>>
作业六:三层神经网络调参
查看>>
Java中的hashcode方法
查看>>
OpenCV学习 7:图像形态学:腐蚀、膨胀
查看>>
软件需求与分析课堂讨论一
查看>>
js添加var和不加var区别
查看>>
时钟程序
查看>>
无法识别的配置节log4net的(Unrecognized configuration section log4net)
查看>>
个人项目-小学四则运算 “软件”之初版
查看>>
cocos2d-html5学习笔记——创建持续性动作
查看>>
软件工程心得体会
查看>>
typedef typedef struct的使用
查看>>
Log4Net各参数API
查看>>
接收发送给服务器的Post请求
查看>>
asp.net客户端IP跟踪
查看>>
前端jquery validate表单验证框架的使用
查看>>
HDU 2602 Bone Collector (01背包)
查看>>
VMware NAT端口映射外网访问虚拟机linux
查看>>