最近在使用运行时权限,发现一些博客上说EasyPermissions这个库很好用,于是我便也开始看看。
官方文档:
https://github.com/googlesamples/easypermissions
运行时权限官方文档解释:
https://developer.android.com/training/permissions/requesting.html
为什么使用Easypermissions
Android M对于权限系统进行了改变.Android M之前所需权限只需要在AndroidManifest中申请即可。但更新Android M系统后,部分“危险许可”需要在运行时询问申请。
在6.0下新的权限机制分为两类,Normal Permissions,这类权限是不需要用户授权,不会触及用户的隐私,只需要在manefest里面申请即可;还有一类是Dangerous Permissions,这类权限需要动态的去申请。
Normal Permission如下:
可以看到Dangerous Permissions是按照组来分类的,如果申请了一组的其中一个权限,那么默认会获得该组的所有权限的使用。
申请的流程
1.在AndroidManifest里面配置需要的权限,无论是普通的还是特殊的权限都需要在这里配置。
2.检查权限,如果没有权限则申请
3.给用户申请权限的解释,这个方法只会在第一次用户拒绝授权,再次去申请这个的权限时会用到
4.申请相应的权限
5.处理申请权限的回调,在这里获得哪些授权成功哪些失败,处理需要的逻辑
具体的例子
下面的例子是获取用户的写外部存储器和打开照相机的权限
1.先在AndroidManifest.xml中加载所要申请的权限
<!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />2.未封装的使用<!--拍照权限--> <uses-permission android:name="android.permission.CAMERA" />
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main2);
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA
) - != PackageManager.PERMISSION_GRANTED) {//未获取权限
- if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA
)) { - //当用户第一次申请拒绝时,再次申请该权限调用
- Toast.makeText(this, "打开照相机权限", Toast.LENGTH_SHORT).show();
- }
- //申请权限
- ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 0x02);
- } else {//已经获得了权限
- camera();
- }
- }
- private void camera() {
- Toast.makeText(this, "打开照相机", Toast.LENGTH_SHORT).show();
- }
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (requestCode == 0x02) {
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//授权成功
- camera();
- } else {//授权失败
- Toast.makeText(this, "获取权限失败", Toast.LENGTH_SHORT).show();
- }
- }
- }
- }
3.封装的三方库------EasyPermissions
这个用于权限的申请,使用起来十分的简单
导入库
compile 'pub.devrel:easypermissions:0.4.2'
使用很简单,代码中都有注释,都能看懂
TitleBarView titleBar = new TitleBarView();
titleBar.init(this, "更换头像", titleBar, 1, 0, 1, new MyCallBack.onRightSaveListener() {
@Override
public void onRightSaveClicked() {
new ActionSheetDialog(UserImageUpdateActivity.this)
.builder()
.setCancelable(true)
.setCanceledOnTouchOutside(true)
.addSheetItem("拍照", ActionSheetDialog.SheetItemColor.Blue,
new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int which) {
//所要申请的权限,拍照和写入sd卡
String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(UserImageUpdateActivity.this, perms)){//检查是否获取该权限
LoggerUtil.i("EasyPermissions", "已获取权限");
//获取权限,打开照相机
openCamera();
} else {
//第二个参数是被拒绝后再次申请该权限的解释
//第三个参数是请求码
//第四个参数是要申请的权限
EasyPermissions.requestPermissions(UserImageUpdateActivity.this, "拍照必要的权限", 0, perms);
}
}
})
.addSheetItem("图库", ActionSheetDialog.SheetItemColor.Blue,
new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int which) {
Intent intentTuKu = new Intent(UserImageUpdateActivity.this, AlbumActivity.class);
intentTuKu.putExtra("type_from", AppConstants.USER_INFO);
startActivityForResult(intentTuKu, REQUEST_CODE_FROM_ALBUM);
}
}
).show();
}
});
//获取权限,打开照相机
private void openCamera() {
Intent intentCamera = new Intent(UserImageUpdateActivity.this, CameraActivity.class);
intentCamera.putExtra("type_from", AppConstants.USER_INFO);
intentCamera.putExtra("type", "Back");
startActivityForResult(intentCamera, REQUEST_CODE_FROM_CAMEIA);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//把申请权限的回调交由EasyPermissions处理
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
//下面两个方法是实现EasyPermissions的EasyPermissions.PermissionCallbacks接口
//分别返回授权成功和失败的权限
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
LoggerUtil.i("EasyPermissions", "获取成功的权限" + perms);
if (requestCode == 0) {
if (perms.size() > 0) {
if (perms.contains(Manifest.permission.CAMERA) && perms.contains(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//获取权限,打开照相机
openCamera();
}
}
}
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
LoggerUtil.i("EasyPermissions", "获取失败的权限" + perms);
ToastUtil.showToast(UserImageUpdateActivity.this, "获取拍照权限失败");
}
一般的如果你将你的目标sdk设置成23及以上,就可以看到效果
本文介绍了Android 6.0引入的运行时权限管理系统,详细阐述了为什么需要EasyPermissions库,以及如何使用它简化权限申请流程。包括正常权限和危险权限的区别,以及如何在AndroidManifest.xml中配置权限。同时,文章通过实例展示了如何申请读写存储和使用相机的权限,并处理权限申请的回调。

3285

被折叠的 条评论
为什么被折叠?



