概述
targetSdkVersion是23,在Android 6.0上运行就会遇到crash的问题,因为Android 6.0在原有的AndroidManifest.xml声明权限的基础上,增加了运行时的权限(无法在AndroidManifest.xml中声明),包括:
- 身体传感器
- 日历
- 摄像头
- 通讯录
- 地理位置
- 麦克风
- 电话
- 短信
- 存储空间
代码
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
String[] permissions = checkSelfPermissionArray(Login.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
});
if(permissions.length > 0) {
ActivityCompat.requestPermissions(Login.this, permissions, 1);
}
}
@TargetApi(Build.VERSION_CODES.M)
private static boolean checkSelfPermissionWrapper(Object cxt, String permission) {
if (cxt instanceof Activity) {
Activity activity = (Activity) cxt;
return ActivityCompat.checkSelfPermission(activity,
permission) == PackageManager.PERMISSION_GRANTED;
} else if (cxt instanceof Fragment) {
Fragment fragment = (Fragment) cxt;
return fragment.getActivity().checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
} else {
throw new RuntimeException("cxt is net a activity or fragment");
}
}
//批量申请权限
private static String[] checkSelfPermissionArray(Object cxt, String[] permission) {
ArrayList<String> permiList = new ArrayList<>();
for (String p : permission) {
if (!checkSelfPermissionWrapper(cxt, p)) {
permiList.add(p);
}
}
if (permiList.size() > 0) {
return permiList.toArray(new String[permiList.size()]);
}else {
return new String[]{};
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
//...
}
break;
}
}