以下代码是对android 6.0敏感权限的动态申请,测试可用。申请权限时,如果已经申请过就跳过申请,已经被拒绝的跳转到app对应的详情界面,由用户手动设置。
public class WelcomeActivity extends Activity {
//需要请求的权限列表
private final String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION};
private final int REQUEST_FINE_LOCATION = 0;//请求码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCenterView(R.layout.activity_welcome);
int ret = PermissionUtils.needRequestPermission(this, permissions, REQUEST_FINE_LOCATION);
if (ret == PermissionUtils.Request_permission_unneed) {//不需要请求权限或者已授权
goToNext();
} else if (PermissionUtils.Request_permission_failurd == ret) {//失败关闭界面
// playToast(getString(R.string.permission_need));//提示用户
finish();
}
}
private void goToNext() {
// 做自己想做的事情
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_FINE_LOCATION:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//已授权
// The requested permission is granted.
goToNext();
} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
//已拒绝,去到应用详情界面,用户手动打开
// playToast(R.string.permissions_setting);//提示用户
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
localIntent.setData(Uri.fromParts("package", getPackageName(), null));
// } else if (Build.VERSION.SDK_INT <= 8) {
// localIntent.setAction(Intent.ACTION_VIEW);
// localIntent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
// localIntent.putExtra("com.android.settings.ApplicationPkgName", getPackageName());
}
startActivity(localIntent);
finish();
}
} else {
// The user disallowed the requested permission.
//playToast(getString(R.string.permission_need));//提示用户
finish();
}
break;
}
}
}
PermissionUtils 请求工具类代码,参数传Object是想做兼容,如不需要考虑其它,可以直接换成Activity
public class PermissionUtils {
public static final int Request_permission_unneed = -1;
public static final int Request_permission_failurd = -2;
public static int needRequestPermission(Object object, final @NonNull String[] permissions, final int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (permissions != null) {
if (object instanceof Activity) {
return requesPermissions((Activity) object, permissions, requestCode);
} else {
return Request_permission_failurd;
}
} else {
return Request_permission_failurd;
}
} else {
return Request_permission_unneed;
}
}
public static int requesPermissions(Activity context, @NonNull String[] permissions, int requestCode) {
List<String> withoutPermissions = new ArrayList<>();
//去除已经授权的权限,避免重复请求权限
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED//未授权
/* && ActivityCompat.shouldShowRequestPermissionRationale(context, permissions[i])*/) {//需要授权
withoutPermissions.add(permissions[i]);//将未授权的保存下来
}
}
if (withoutPermissions.size() > 0) {
String[] needPermissions = new String[withoutPermissions.size()];
withoutPermissions.toArray(needPermissions);
ActivityCompat.requestPermissions(context, needPermissions, requestCode);
return requestCode;
}
return Request_permission_unneed;
}
}