android 动态权限的简单封装。
在android 6.0 以后,如果你要进行一些敏感的操作,你就必须动态的申请权限。
在动态申请权限的时候必须先加入静态的权限,在清单文件中进行注册。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后就可以进行动态权限的请求了。
因为权限必须在Activity 中进行申请,为了 单一原则,我将他封装在一个抽象的Activity中,然后让别的activity都继承他。
@SuppressWarnings("ALL")
public abstract class PermissionCheckPepsi extends BaseActivity {
private ICheckPermission mICheckPermission = null;
interface ICheckPermission {
void onAllow();
void onReject();
}
public void checkPermission(String[] permission, ICheckPermission iCheckPermission) {
if (Build.VERSION.SDK_INT < 23 || permission.length == 0) {
if (iCheckPermission != null){
iCheckPermission.onAllow();
}
}else {
if (iCheckPermission != null){
mICheckPermission = iCheckPermission;
ActivityCompat.requestPermissions(this,permission,0);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (mICheckPermission != null && requestCode == 0){
for (int i = 0; i < grantResults.length; i++) {
//判断权限是否被允许,只要又一次拒绝就算失败
if (grantResults[i] == PackageManager.PERMISSION_DENIED){
// 1:用户拒绝了该权限,没有勾选"不再提醒",此方法将返回true。
// 2:用户拒绝了该权限,有勾选"不再提醒",此方法将返回 false。
// 3:如果用户同意了权限,此方法返回false
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[i])){
Toast.makeText(this, "你已拒绝此权限,如果需要,可以在设置中打开此权限", Toast.LENGTH_SHORT).show();
}else {
mICheckPermission.onReject();
}
return;
}
}
mICheckPermission.onAllow();
}
}
}
如上就是一个简单的封装,如果要使用,只需要继承这个类直接调用就好了。
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, new ICheckPermission() {
@Override
public void onAllow() {
Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onReject() {
Toast.makeText(MainActivity.this, "失败", Toast.LENGTH_SHORT).show();
}
});
}
});
注意:要遵循单一原则。要保证一个类只干一件事,像申请权限,直接弄一个抽象类进行封装,让别的类继承自他,这种方式体验非常好。