首页 > 代码库 > 【Android运行时权限申请快速学习教程】

【Android运行时权限申请快速学习教程】

 1. Android权限介绍


  Android权限是Android应用在设备上运行所需要的权力,义务就是为用户带来此Android应用的功能。

  问题来源:在Android6.0版本之前,根据App在AndroidManifest申请的权限,在安装此App的时候进行提示权限允许,不允许就不给装不给用,那么我们只能默默的忍受这个APP对我们隐私的侵蚀(Eg.通讯录的读取权限)。

  解决办法:后来Google发现,诶,这样会导致Android用户们想用这个APP的某些功能而不能用。因此,在Android6.0将权限分为两类,即Normal Permissions(普通权限)与Dangerous Permission(危险权限),在APP在运行时所需要的权限可进行动态申请。

2. Android运行时权限申请(基于easypermissions)


2.1 问题:

  基于easypermissions在Android 6.0版本上申请CAMERA与ACCESS_FINE_LOCATION权限。

2.2 解决问题过程:

   I. 在使用权限的Activity中加入onRequestPermissionsReult()请求权限函数。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // Forward results to EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
}

  II. 自定义methodRequiresTwoPermission()需要运行时权限的函数。

@AfterPermissionGranted(RC_CAMERA_AND_LOCATION)
private void methodRequiresTwoPermission() {
    String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION};
    if (EasyPermissions.hasPermissions(this, perms)) { //1、首先检查是否存在此权限
        // Already have permission, do the thing
        // ...
    } else {
        // Do not have permissions, request them now
        EasyPermissions.requestPermissions(this, getString(R.string.camera_and_location_rationale),
                RC_CAMERA_AND_LOCATION, perms); // 2、没有权限即申请
    }
}

  III. 方便调试,用户究竟是授权或者拒决哪项权限可重写Activity的onPermissionsGranted与onPermissionsDenied函数。

    @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
     // requestCode就是刚刚RC_CAMERA_AND_LOCATION
// Some permissions have been granted // ... } @Override public void onPermissionsDenied(int requestCode, List<String> list) {
     // Some permissions have been denied
     //...
  }

3. 总结


  第一步,为了兼容Android6.0版本以下的权限申请,我们还是需要在AndroidManifest中申明我们需要的权限;

  第二步,Android6.0版本的运行时权限申请使用基于easypermissions进行动态申请。

  另外,属于同一权限组里面的其中一个权限被授权,权限组里面剩余的权限都会被授权。

4.参考:


  https://developer.android.com/guide/topics/security/permissions.html?hl=zh-cn#normal-dangerous

  http://blog.csdn.net/lmj623565791/article/details/50709663 

  https://github.com/googlesamples/easypermissions

  http://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ

【Android运行时权限申请快速学习教程】