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

2018-12-16  本文已影响24人  ShanksWang

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

上一篇下一篇

猜你喜欢

热点阅读