一、前文
之前使用的图片裁剪功能一直是使用第三方的,也没时间去思考自己写一个的想法。后来无意间发现android自己本来就有裁剪功能,所以自己动手去集成了一把,并且把自己的权限封装以及7.0的适配都加进去
二、注意的几个点
其实也没有什么好说的,基本没有难度,只是有几个需要注意的点
1.一个是7.0的文件安全机制,7.0之后android对于文件的安全增加了保护,在部分地方使用Uri会产生FileUriExposedException文件暴露异常。
2.其次,就是对于权限的封装,只有拿到了权限才能进行操作,做好权限适配,这些下面会一并讲到。
三、权限封装
权限封装最好封装到一个方法里面,独立处理权限,这样也可以比较轻松的集成在BaseActivity里面,在用的地方直接调,可以达到权限随用随取得效果。先看看关键代码
public void needPermission(AppPermissionListener mAppPermissionListener, List<String> permissions) {
if (null != permissions && permissions.size() > 0) {
this.appPermissionListener = mAppPermissionListener;
this.allPermission = permissions;
// 允许的权限
allowPermission.clear();
// 被拒绝的权限
deniedPermission.clear();
// 不在询问的权限
neverAskPermission.clear();
// 开始遍历拿到的权限
Observable.fromIterable(allPermission)
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
// 判断是否有WRITE_SETTINGS特殊权限
if (s.equals(Manifest.permission.WRITE_SETTINGS)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// WRITE_SETTINGS需要用该方式判断
if (!Settings.System.canWrite(mActivity))
allowPermission.add(s);
else
haveWriteSetting = true;
}
} else if (ActivityCompat.checkSelfPermission(mActivity, s)
== PackageManager.PERMISSION_GRANTED) {
allowPermission.add(s);
} else {
deniedPermission.add(s);
}
}
});
<