- 运行效果:
- 剪裁框架
implementation 'com.yalantis:ucrop:2.2.0-native'
- 需要权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
- 这三个权限都属于危险权限,因此在6.0以上的系统版本需要动态授权
final List<String> permissionsList = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if ((activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED))
permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if ((activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED))
permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
if ((activity.checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED))
permissionsList.add(Manifest.permission.CAMERA);
if (permissionsList.size() != 0) {
activity.requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_PHONE_PERMISSIONS);
}
}
- 在res资源文件下创建xml文件夹,然后再创建file_paths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="Android/data/包名/" name="files_root" />
<external-path path="." name="external_storage_root" />
</paths>
- 在AndroidManifest.xml中配置
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名.fileProvider"//这里必须要与代码中同步 不然会出问题
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
- 配置部分已经完成,接下来就是实现调用系统相机和相册
1、打开相册
/**
* 相册
* @param activity
*/
public static void onPickPicture(Activity activity) {
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
activity.startActivityForResult(intent, CHECKED_PHOTO);
}
2、调用系统相机
/**
* 拍照
*
* @param activity
*/
public static Uri onTakePhoto(Activity activity) {
Uri outputFileUri ;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String p= Util.getSaveDir(activity)+ File.separator+"photo";
File files=new File(Util.getSaveDir(activity)+ File.separator+"photo");
if(!files.exists()){
files.mkdir();
}
File file = new File(p, "p.jpg");
if(file.exists()){
file.delete();
}
if (Build.VERSION.SDK_INT >= 24) {
outputFileUri = FileProvider.getUriForFile(activity.getApplicationContext(), "包名.fileProvider", file);
} else {
outputFileUri = fromFile(file);
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
activity.startActivityForResult(intent, TAKE_PHOTO);
return outputFileUri;
} else {
LogUtils.TOAST("您的设备不支持此功能!");
}
return null ;
}
outputFileUri 为拍照完了之后的路径
3、调用完相册和相机之后的结果处理
/**
* 适配上传图片
*
* @param requestCode
* @param resultCode
* @param intent
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode == Activity.RESULT_OK) {
switch (requestCode){
//选择相册图片上传
case EditUserHeadPictureDialog.CHECKED_PHOTO:
EditUserHeadPictureDialog.cutPicture(this,intent.getData());
break;
//拍照上传图片
case EditUserHeadPictureDialog.TAKE_PHOTO:
EditUserHeadPictureDialog.cutPicture(this,outFileUri);
break;
//剪切图片上传
case UCrop.REQUEST_CROP:
//最终得到的图片地址 ,用来做事情
Uri resultUri = UCrop.getOutput(intent);
break;
}
}
}
- 剪裁实现代码
/**
* 裁剪
*
* @param uri
*/
public static void cutPicture(Activity context, Uri uri) {
UCrop.Options options = new UCrop.Options();
//裁剪后图片保存在文件夹中
Uri destinationUri = Uri.fromFile(new File(context.getExternalCacheDir(), "uCrop.jpg"));
UCrop uCrop = UCrop.of(uri, destinationUri);//第一个参数是裁剪前的uri,第二个参数是裁剪后的uri
uCrop.withAspectRatio(1,1);//设置裁剪框的宽高比例
//下面参数分别是缩放,旋转,裁剪框的比例
options.setAllowedGestures(UCropActivity.ALL,UCropActivity.NONE,UCropActivity.ALL);
options.setToolbarTitle("移动和缩放");//设置标题栏文字
options.setCropGridStrokeWidth(2);//设置裁剪网格线的宽度(我这网格设置不显示,所以没效果)
options.setCropFrameStrokeWidth(2);//设置裁剪框的宽度
options.setMaxScaleMultiplier(3);//设置最大缩放比例
options.setHideBottomControls(false);//隐藏下边控制栏
options.setShowCropGrid(true); //设置是否显示裁剪网格
// options.setOvalDimmedLayer(true);//设置是否为圆形裁剪框
options.setShowCropFrame(true); //设置是否显示裁剪边框(true为方形边框)
options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//标题字的颜色以及按钮颜色
options.setDimmedLayerColor(Color.parseColor("#AA000000"));//设置裁剪外颜色
options.setToolbarColor(Color.parseColor("#000000")); // 设置标题栏颜色
options.setStatusBarColor(Color.parseColor("#000000"));//设置状态栏颜色
options.setCropGridColor(Color.YELLOW);//设置裁剪网格的颜色
options.setCropFrameColor(Color.YELLOW);//设置裁剪框的颜色
uCrop.withOptions(options);
uCrop.start(context);
}
Nice!装逼完成