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'