美文网首页
Android开发快捷申请权限,第三方库EasyPermissi

Android开发快捷申请权限,第三方库EasyPermissi

作者: ShanksWang | 来源:发表于2018-12-16 22:51 被阅读24次

    6.0之后需要运行时权限了, 具体概念请您移步这里permissions/requesting

    下面以申请存储条件为例
    EasyPermissionsgithub地址。

    1. 声明
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    申请同组的一个,被授予后;当同组的另外一个权限需要使用时,仅当AndroidManifest文件声明了该权限,系统会自动赋予,开发者无须再次申请。
    举个例子: 读和写sd两个权限是同一组的,当用户在app中授予了读取sd的权限,那当app需要用到写入sd的权限时,app会被Android系统自动授予,类似于family plan。

    1. 导入第三方库
    // build.gradle (app)
    dependencies {
        implementation 'pub.devrel:easypermissions:2.0.0'
    }
    
    1. 实现两个回调,跑log
    public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, EasyPermissions.RationaleCallbacks {
    ...
    @Override
        public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
            if (requestCode == 200) {
                Log.d("TAG", "onPermissionsGranted: ");
                dispatchTakePicIntent();
    //            startCamera();
            }
        }
    
        @Override
        public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
            if (requestCode == 200) {
                Log.d("TAG", "onPermissionsDenied: ");
            }
        }
    
        @Override
        public void onRationaleAccepted(int requestCode) {
            if (requestCode == 200) {
                Log.d("TAG", "onRationaleAccepted: ");
            }
        }
    
        @Override
        public void onRationaleDenied(int requestCode) {
            Log.d("TAG", "onRationaleDenied: ");
        }
    

    Activity/Fragment中需要实现onRequestPermissionsResult()回调,不然有诡异的事发生。
    举个例子,当用户第一次拒绝了app使用sd存储器的请求,再次申请时,出现向用户解释,为什么需要该权限理由,像:need use storage。此时,不管用户选择授予,还是拒绝,都没有对应的log。

    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
        }
    
    1. 组装
      设想,点击拍照按钮,申请权限,用户决定授予权限与否的情景。
    How to Ask Permission
    @OnClick(R.id.btn_take_pic)
        public void onCaptured() {
            // 检查外置存储器写权限
            if (!EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                // ask permission with ReasonOfPermission, RequestCord and PermissionName
                EasyPermissions.requestPermissions(this, "need use storage", 200, Manifest.permission.WRITE_EXTERNAL_STORAGE);
                Log.d("TAG", "onCaptured: requestPermissions ");
            } else {
    //            startCamera();
                dispatchTakePicIntent();
                Log.d("TAG", "onCaptured: hasPermissions");
            }
            Log.d("TAG", "onCaptured: ");
        }
    

    注意事项

    1. onPermissionsDeniedonRationaleDenied回调方法中直接继续申请权限不起作用的。
    2. onRationaleAccepted回调方法中直接继续申请权限,不需要的,这方法走完后,会自动再次申请权限的。

    参考:
    EasyPermissions

    相关文章

      网友评论

          本文标题:Android开发快捷申请权限,第三方库EasyPermissi

          本文链接:https://www.haomeiwen.com/subject/erhfkqtx.html