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>() {@Overridepublic 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;}}@Overridepublic 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以上URIif (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);}@Overrideprotected 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及目标uriUCrop.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>() {@Overridepublic 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() {@Overridepublic 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'