Android开发快捷申请权限,第三方库EasyPermissi
2018-12-16 本文已影响24人
ShanksWang
6.0之后需要运行时权限了, 具体概念请您移步这里permissions/requesting
下面以申请存储条件为例
EasyPermissionsgithub地址。
- 声明
<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。
- 导入第三方库
// build.gradle (app)
dependencies {
implementation 'pub.devrel:easypermissions:2.0.0'
}
- 实现两个回调,跑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);
}
- 组装
设想,点击拍照按钮,申请权限,用户决定授予权限与否的情景。
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: ");
}
注意事项:
- 在
onPermissionsDenied
和onRationaleDenied
回调方法中直接继续申请权限,不起作用的。 - 在
onRationaleAccepted
回调方法中直接继续申请权限,不需要的,这方法走完后,会自动再次申请权限的。
参考:
EasyPermissions