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接口来判断。问题就出在这里,按照之前的写法写出后会在弹出权限的申请后立马闪退。 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == MY_PERMISSIONS_REQUEST_SEND_SMS) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission Granted } else { // Permission Denied } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } } 经排查发现使用这种情况会在判断grantResults[0] == PackageManager.PERMISSION_GRANTED这一语句的时候出现数组非法的情况。这是因为用户还没有对弹出的权限对话框做出选择,但该事件已经被触发,此时的grantResult是一个空数组,判断他的第一个元素是否为1就会出现exception: 对于使用switch语句的另一种写法也可能出现类似情况。 这里的解决方案是将条件判断改为grantResults.length == 1 && grantResults[0] == PackageManager....

January 22, 2019 · Bill Chen