android从6.0版本以后为了提升android用户的安全性添加了重要危险的权限必须申请以后才能使用,例如向读取手机状态,蓝牙,SD卡等这些涉及用户信息这种权限,我们必须在manifest中注册,也必须在代码中动态申请才能正常使用这些权限功能。
用户授权一般来说我们有2种方式:
- 在用户安装完成后第一次进入App后,我们在引导界面即可以对所有的权限进行申请,让用户授予我们当前APP所有的权限
- 第二种方式比较灵活,不采用一次性授权,而是当用户使用到我们需要权限的地方,动态的调取授权方法,进行授权
这里我们将权限单独进行处理,放进我们的基础类中,这样不管是我们一次性授权还是根据用户的使用来进行授权都可以。
直接上代码:
首先我们定义一个接口返回授权的结果:
/**
* 权限授权成功失败的回调
*/
public interface PermissonListener {
/**
* 成功
*/
void onGranted();
/***
* 失败
* @param denidePermisson 失败返回我们的被用户拒绝的权限
*/
void onDenide(List<String> denidePression);
}我们在基类BaseActivity中添加申请权限的方法,判断是否需要权限申请,有则提交申请,没有则返回成功
public void requestPermisson(String[] permissons, PermissonListener lister) {
//permissons 申请的权限集合 PermissonListener 对应的接口
// 通过activity管理器获取当前栈顶activity
Activity toActivity = AppManager.getAppManager().currentActivity();
//判断是否为空
if (toActivity == null) {
return;
}
//接口对象
mListener = lister;
//创建一个新的集合 用来判断提交的授权集合中那些是没有给予授权的 添加到这个新的集合中
List<String> permissonsList = new ArrayList<>();
//判断提交的权限集合中是否存在没有授权的权限
for (String premison : premisons) {
if (ContextCompat.checkSelfPermission(toActivity, premison) != PackageManager.PERMISSION_GRANTED) {
permissonList.add(premison);
}
}
//判断新集合中是否有需要授权的权限 如果没有则直接返回成功 有需要提交
if (!permissonList.isEmpty()) {
ActivityCompat.requestPermissions(toActivity, permissonList.toArray(new String[permissonList.size()]), 1); } else {
//权限已经全部授权
mListener.onGranted();
}
}当然我们需要实现onRequestPermissionsResult这个方法来接收我们提交注册的权限返回的结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
//判断返回是否有被拒绝权限
if (grantResults.length > 0) {
List<String> denidePermission = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
String perission = permissions[i];
if (grantResult != PackageManager.PERMISSION_GRANTED) {
denidePermission.add(perission);
}
}
//返回结果
if (denidePermission.isEmpty()) {
mListener.onGranted();
} else {
mListener.onDenide(denidePermission);
}
}
break;
default:
break;
}简单的基本调用就完成了,因为写在BaseActivity基类里面,当Activity继承BaseActivity后便可以调用方法进行授权,如果你需要一次性授权,则可以在APP启动界面进行权限授权,并且可以对授权结果进行处理。也可以使用的时候进行授权,比如挡在调用相机时 ,在调用之前进行授权。使用参考:
public class SplashActivity extends BaseActivity {
private String[] permitionstrings = new String[]{Manifest.permission.CAMERA,
Manifest.permission.READ_PHONE_STATE};
@Override
protected int getContentViewResId() {
return R.layout.activity_splash;
}
@Override
protected void initData() {
TextView textSplashContent= (TextView) findViewById(.text_splash_content);
textSplashContent.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//授权方法
Permissionsdetect(permitionstrings);
}
});
}//权限验证
public void Permissionsdetect(String[] strings) {
requestRuntimePermison(strings, new PermissonListener() {
@Override
public void onGranted() {
//全部权限已经授权成功
}
@Override
public void onDenide(List<String> denidePression) {
Log.i("i", "授权失败----ondenide");
//有权限没有授权成功 可以denidePression查看没有通过的权限并且进行你的下一步处理
});
}以上就是简单的权限注册解决方案,走到这里别忘了 我们最基本申请动态权限,也需要在AndroidMainfest清单文件里面申明申请的权限
















