Android之uCrop (裁剪) 的基本使用资料
Android 拍照、选择图片并裁剪
uCrop裁剪
uCrop裁剪2
uCrop裁剪3
1.权限检查
private static final int REQUEST_CAMERA_PERMISSION = 333;
private void requestCameraPermission() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION);
}
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_CAMERA_PERMISSION);
}
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CAMERA_PERMISSION);
}
}
2.拍照 相册选择弹框
private void showMenuDialog() {
List<String> data = new ArrayList<>();
data.add("拍照");
data.add("相册中获取");
// 底部选择框
new MenuDialog.Builder(this)
// 设置 null 表示不显示取消按钮
//.setCancel(getString(R.string.common_cancel))
// 设置点击按钮后不关闭对话框
//.setAutoDismiss(false)
.setList(data)
.setListener(new MenuDialog.OnListener<String>() {
@Override
public void onSelected(BaseDialog dialog, int position, String string) {
phoneArr = new JSONArray();
phoneArray = new JSONArray();
switch (position) {
case 0:
// // 调本地相机
camera();
break;
case 1:
openSysAlbum();
break;
case 2:
break;
default:
break;
}
}
@Override
public void onCancel(BaseDialog dialog) {
toast("取消了");
}
})
.show();
}
/**
* 拍照
*/
private void camera() {
File file = new File(SAVE_REAL_PATH, System.currentTimeMillis() + ".jpg");
Log.e(TAG, "拍照路径:" + file.getPath());
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//Android7.0以上URI
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//通过FileProvider创建一个content类型的Uri 注意报名和大小写
// mProviderUri = FileProvider.getUriForFile(getActivity(), "com.baijie.crm.fileProvider", file);
mProviderUri = FileProvider.getUriForFile(this, AppConfig.getPackageName() + ".provider", file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mProviderUri);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
mUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
}
try {
startActivityForResult(intent, RESULT_CODE_1);
} catch (ActivityNotFoundException anf) {
Log.e(TAG, "摄像头未准备好!");
}
}
/**
* 打开系统相册
*/
private void openSysAlbum() {
Intent innerIntent = new Intent();
if (Build.VERSION.SDK_INT < 19) {
innerIntent.setAction(Intent.ACTION_GET_CONTENT);
} else {
innerIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);
}
innerIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
Intent wrapperIntent = Intent.createChooser(innerIntent, "");
startActivityForResult(wrapperIntent, SELECT_IMAGE_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == UCrop.RESULT_ERROR) {
LogUtil.d("--onActivityResult--:", UCrop.getError(data) + "");
return;
}
if (resultCode == RESULT_OK) {
switch (requestCode) {
case RESULT_CODE_1:// 拍照
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
cropRawPhoto(mProviderUri);
} else {
cropRawPhoto(mUri);
}
break;
case RESULT_CODE_2:
Log.i(TAG, "onActivityResult: " + data.getData());
cropRawPhoto(data.getData());
break;
case UCrop.REQUEST_CROP:
// 裁剪后的图片进行识别
LogUtil.d(TAG, "onActivityResult: " + UCrop.getOutput(data));
LogUtil.d(TAG, UCrop.getOutput(data) + "");
// 在这里使用imageBitmap进行文字识别
Uri uri = UCrop.getOutput(data);
if (uri != null) {
try {
// 使用MediaStore来获取Bitmap对象
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
// 使用bitmap对象...
recognizeTextFromBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
break;
case SELECT_IMAGE_REQUEST_CODE:
// 相册中选择图片去识别
Uri uri_ = data.getData();
Bitmap bitmap = getBitmapFromUri(uri_, this);
recognizeTextFromBitmap(bitmap);
break;
default:
break;
}
}
}
3.调用UCrop进行图片裁剪
/**
* 使用UCrop进行图片剪裁
*
* @param uri
*/
public void cropRawPhoto(Uri uri) {
UCrop.Options options = new UCrop.Options();
// 修改标题栏颜色
options.setToolbarColor(getResources().getColor(R.color.teal_200));
// 修改状态栏颜色
options.setStatusBarColor(getResources().getColor(R.color.teal_700));
// 隐藏底部工具
options.setHideBottomControls(true);
// 图片格式
options.setCompressionFormat(Bitmap.CompressFormat.JPEG);
// 设置图片压缩质量
options.setCompressionQuality(100);
// 是否让用户调整范围(默认false),如果开启,可能会造成剪切的图片的长宽比不是设定的
// 如果不开启,用户不能拖动选框,只能缩放图片
options.setFreeStyleCropEnabled(true);
options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.NONE, UCropActivity.NONE); // 只允许缩放
// 设置图片压缩质量
options.setCompressionQuality(100);
// 圆
options.setCircleDimmedLayer(false);
// 不显示网格线
options.setShowCropGrid(true);
createOrExistsDir(SAVE_REAL_PATH);
// 设置源uri及目标uri
UCrop.of(uri, Uri.fromFile(new File(SAVE_REAL_PATH, System.currentTimeMillis() + ".jpg")))
// 长宽比
// .withAspectRatio(1, 1)
// 图片大小
// .withMaxResultSize(200, 200)
// 配置参数
.withOptions(options)
.start(this);
}
public boolean createOrExistsDir(String dirPath) {
File dir = new File(dirPath);
// 判断目录是否存在
if (!dir.exists()) {
// 尝试创建目录
return dir.mkdirs();
}
return true; // 目录已存在,返回true
}
4.裁剪后的图片进行文字内容的识别,这里是识别手机号码这种数字类型的内容
private void recognizeTextFromBitmap(Bitmap bitmap) {
InputImage image = InputImage.fromBitmap(bitmap, 0);
TextRecognizer myRecognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS);
myRecognizer.process(image)
.addOnSuccessListener(new OnSuccessListener<Text>() {
@Override
public void onSuccess(com.google.mlkit.vision.text.Text text) {
String identifyContent = text.getText();
LogUtil.d(TAG, "识别结果为:" + identifyContent);
// phoneArr.put(identifyContent);
etPhone.setText(identifyContent);
myRecognizer.close();
startActivity(new Intent(ctx, ConfirmCustomerActivity.class).putExtra("IdentifyContent", identifyContent));
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// 处理错误
e.printStackTrace();
// 释放资源
myRecognizer.close();
}
});
}
public Bitmap getBitmapFromUri(Uri uri, Context context) {
ContentResolver contentResolver = context.getContentResolver();
InputStream inputStream = null;
try {
inputStream = contentResolver.openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
private String SAVE_REAL_PATH = "/sdcard/DCIM/Camera";
Uri mProviderUri;
Uri mUri;
private final int RESULT_CODE_1 = 1;
private final int RESULT_CODE_2 = 2;
private final int SELECT_IMAGE_REQUEST_CODE = 999;
// 流式布局
implementation 'com.github.AnJiaoDe:MultiFlowLayout:1.1.1'
implementation 'com.google.mlkit:text-recognition:16.0.0'
implementation 'com.github.yalantis:ucrop:2.2.6'
implementation 'com.github.yalantis:ucrop:2.2.6-native'