android从6.0版本以后为了提升android用户的安全性添加了重要危险的权限必须申请以后才能使用,例如向读取手机状态,蓝牙,SD卡等这些涉及用户信息这种权限,我们必须在manifest中注册,也必须在代码中动态申请才能正常使用这些权限功能。 

用户授权一般来说我们有2种方式:

  1.  在用户安装完成后第一次进入App后,我们在引导界面即可以对所有的权限进行申请,让用户授予我们当前APP所有的权限
  2. 第二种方式比较灵活,不采用一次性授权,而是当用户使用到我们需要权限的地方,动态的调取授权方法,进行授权

 这里我们将权限单独进行处理,放进我们的基础类中,这样不管是我们一次性授权还是根据用户的使用来进行授权都可以。

直接上代码:

首先我们定义一个接口返回授权的结果:

/**
 * 权限授权成功失败的回调
 */
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清单文件里面申明申请的权限