不想下载demo的直接复制文中代码就可以用了
demo地址:http://download.csdn.net/detail/bnm52007/9801104
为了减少重复代码,就把请求权限方法全部放在activity的基类里了,如果你不想放在基类里也可以直接把本demo的方法复制出来单独用。
此demo抽去了一个BaseActivity,请求权限时只需要传入(“要请求的权限(多个权限就传数组)”,requestCode,”用户拒绝时提示的内容”)
MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置权限才能使用");
注意事项
如果targetSdkVersion 25 小于23那一开始默认安装APP就会获得权限
demo拒绝授权提示对话框使用的时默认样式如果你的和demo的不同是因为activity的主题不同,请在清单文件修改。
一般请求权限流程:
在清单文件加上要请求的权限,activity继承OnRequestPermissionsResultCallback,重写onRequestPermissionsResult方法,判断是否请求成功
1、判断是否大于或等于23
2、判断是否已经有权限了
3、有就直接使用,没有就去请求
一次请求多个权限时,遍历数组看那权限没有就去请求那个,不重复请求以具备的权限
//单个权限请求检测,true不需要请求权限,false需要请求权限
public boolean isPermissionGranted(String permissionName) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
//判断是否需要请求允许权限
int hasPermision = checkSelfPermission(permissionName);
if (hasPermision != PackageManager.PERMISSION_GRANTED) {
return false;
}
return true;
}
//多个权限请求检测,返回list,如果list.size为空说明权限全部有了不需要请求,否则请求没有的
public List<String> isPermissionsAllGranted(String[] permArray) {
List<String> list = new ArrayList<>();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return list;
}
for (int i = 0; permArray != null && i < permArray.length; i++) {
//获得批量请求但被禁止的权限列表
if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permArray[i])) {
list.add(permArray[i]);
}
}
return list;
}
//单个权限请求
protected void Requestpermission(String s, int requestCode, String defeat) {
hint = defeat;
if (!TextUtils.isEmpty(s)) {
boolean granted = isPermissionGranted(s);
if (granted) { //有权限,调用方法
okPermissionResult(requestCode);
} else {
requestPermissions(new String[]{s}, requestCode);
}
}
}
//多个权限请求
protected void Requestpermission(String s[], int requestCode, String defeat) {
hint = defeat;
if (s.length != 0) {
List<String> perList = isPermissionsAllGranted(s);
if (perList.size() == 0) { //有权限,调用方法
okPermissionResult(requestCode);
} else {
requestPermissions(perList.toArray(new String[perList.size()]), requestCode);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for (int i : grantResults) {
if (i != PackageManager.PERMISSION_GRANTED) { //有权限未通过
popAlterDialog();
return;
}
}
okPermissionResult(requestCode);
}
//有权限调用
protected void okPermissionResult(int requestCode) {
}
public void popAlterDialog() {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage(hint)
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//前往应用详情界面
try {
Uri packUri = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packUri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (Exception e) {
Toast.makeText(BaseActivity.this, "跳转失败", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
}
}).create().show();
}
使用方法
//定位,单个权限请求
findViewById(R.id.tv_location).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//参数说明:权限字符串,请求标记码(requestCode),用户拒绝权限提示内容
MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置权限才能使用");
}
});
//多个权限请求
findViewById(R.id.tv_allpeimission).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//参数说明:要请求的权限数组,请求标记码(requestCode),用户拒绝权限提示内容
String[] perms = {
Manifest.permission.CAMERA
, Manifest.permission.RECORD_AUDIO
, Manifest.permission.READ_EXTERNAL_STORAGE};
MainActivity.super.Requestpermission(perms,102,"需要相机,麦克风,存储权限");
}
});
@Override
protected void okPermissionResult(int requestCode) {
if (requestCode==99){
Toast.makeText(this,"有位置权限了",Toast.LENGTH_SHORT).show();
}else if (requestCode==102){
Toast.makeText(this,"有相机,麦克风,存储权限了",Toast.LENGTH_SHORT).show();
}
}