修改 ,不用android-crop裁剪功能,pictureselector自带裁剪。。。。。。。
.isEnableCrop(true) // 是否裁剪
.withAspectRatio(1, 1)// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
1.依赖
api 'com.github.getActivity:XXPermissions:11.8' //权限
implementation 'com.soundcloud.android:android-crop:1.0.1@aar' //裁剪包,高版本调用手机裁剪功能不行,调用这个包
api 'io.github.lucksiege:pictureselector:v2.7.3-rc05' //拍照相册图片选择器
2.调用, 注意getFilesDir(),是保存在app 的file内,不需要可以换getCacheDir(),保存在缓存cache文件内
PictureSelectorUtil.selectSingleImage(CatInfoAct.this, true, imagePath -> {//封装权限获取及回调获取到的图片路径Path --》imagePath
File ori = new File(imagePath);
Uri destination=Uri.fromFile(new File(getFilesDir(),"csg"+System.currentTimeMillis()+".jpg"));//保存的文件路径,文件名
Crop.of(Uri.fromFile(ori),destination).asSquare().start(this); //返回uri进行裁剪
});
3.获取裁剪后的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Crop.REQUEST_CROP) {
String url = setImageToHeadView(data);//获取更新到UI里并返回文件路径做保存
headUrl = url;
Log.e("CZH","url"+url); // '/data/user/0/com.catowner.note/files/csg1666254196337.jpg'
}
}
private String setImageToHeadView(Intent result) {
if (result != null) {
picUri = Crop.getOutput(result);
Glide.with(this)
.load(picUri)
.apply(options)
.into(binding.head);
return picUri.getPath();
}
return "";
}
以下为封装的PictureSelectorUtil
public class PictureSelectorUtil {
public static void selectSingleImage(@NonNull Activity activity, boolean useCamera, @NonNull SingleImageCallback callback) {
List<String> permissions = new ArrayList<>(); //所需权限集合
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
permissions.add(Permission.MANAGE_EXTERNAL_STORAGE);
} else {
permissions.add(Permission.READ_EXTERNAL_STORAGE);
permissions.add(Permission.WRITE_EXTERNAL_STORAGE);
}
String msg = "此功能需要存储权限";
if (useCamera) {
permissions.add(Permission.CAMERA);
msg = "此功能需要存储和相机权限";
}
PermissionUtil.hasPermissions(activity, permissions, msg, () -> {
PictureSelector.create(activity) //PictureSelector选择器,有兴趣可以看一下它的配置参数进行设置
.openGallery(PictureMimeType.ofImage())
.imageEngine(GlideEngine.getInstance())
.isCamera(useCamera) //是否要有拍摄
.selectionMode(PictureConfig.SINGLE)
.forResult(new OnResultCallbackListener<LocalMedia>() {
@Override
public void onResult(List<LocalMedia> result) {
if (result.size() > 0) {
String imagePath = result.get(0).getRealPath();
callback.onSelected(imagePath);
}
}
@Override
public void onCancel() {
}
});
});
}
public interface SingleImageCallback {
void onSelected(@NonNull String imagePath); //回调接口
}
}
权限获取的 PermissionUtil
public class PermissionUtil {
public static void hasPermissions(@NonNull Context context, List<String> permissions, String msg, @NonNull HasCallback callback) {
XXPermissions.with(context)
.permission(permissions)
.request(new OnPermissionCallback() {
@Override
public void onGranted(List<String> permissions, boolean all) {
if (all) {
callback.onGranted();
}
}
@Override
public void onDenied(List<String> permissions, boolean never) {
if (never) {
AlertDialog alertDialog = new AlertDialog.Builder(context)
.setTitle("警告")
.setMessage(msg)
.setPositiveButton("跳转到权限", (dialog, which) -> {
XXPermissions.startPermissionActivity(context, permissions);
})
.setNegativeButton("取消", null)
.create();
alertDialog.show();
alertDialog.getWindow().setGravity(Gravity.CENTER);
} else {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
});
}
public interface HasCallback {
void onGranted(); //回调接口
}
}
大致效果图: