我在Android 6危险权限功能方面遇到了一些麻烦,用户必须明确授予某些权限。就我而言,我使用以下代码请求一组权限:
public class SplashScreenActivity extends BaseActivity implements
RefreshClientOptionsTask.IRefreshClientOptionsListener {
private static final String [] DANGEROUS_PERMISSIONS = {permission.READ_PHONE_STATE,
permission.READ_SMS,
permission.ACCESS_FINE_LOCATION,
permission.CALL_PHONE,
permission.WRITE_EXTERNAL_STORAGE,
permission.READ_EXTERNAL_STORAGE,
permission.CAMERA
};
private void initPermissions() {
List<String> missingPermissions = new ArrayList<String>();
for(String permission : DANGEROUS_PERMISSIONS) {
if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
missingPermissions.add(permission);
}
}
if (missingPermissions.size() > 0) {
String [] permissions = new String[missingPermissions.size()];
ActivityCompat.requestPermissions(
this,
missingPermissions.toArray(permissions),
1);
} else {
// we have all permissions, move on
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for(int grantResult : grantResults) {
// handle denied permissions
}
}
}
当这段代码执行时,我会看到四个权限请求对话框。在每个对话框中按“允许”后,onRequestPermissionsResult
执行grantResults
参数包含除PERMISSION_GRANTED
权限之外的所有零(READ_SMS
) - 它等于-1({{ 1}})。发生了什么,我该如何处理这种情况?
我正在测试运行Android 6.0的物理设备。
答案 0 :(得分:2)
在处理Marshmallow的新权限模型时,除了在运行时请求危险权限外,还必须在清单中列出所有必需的权限。
在这种情况下,您似乎在清单中实际上没有READ_SMS
权限,这就是它在运行时被拒绝的原因。
答案 1 :(得分:1)
Android已更改权限接受最新 23 API级别,在此过程中某些权限将在安装时自动授予,这些权限在清单中指定,剩余权限是接受的在RunTime中,因为有很多坏人试图通过这个安全漏洞来收集用户的个人数据所以Android更改为运行时权限
有关运行时权限的更多信息 检查以下链接
Everything every Android Developer must know about new Android's Runtime Permission