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(R.id.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清单文件里面申明申请的权限