فهرست منبع

完成原生适配

詹子聪 5 سال پیش
والد
کامیت
d145a68935

+ 4 - 0
app/build.gradle

@@ -87,4 +87,8 @@ dependencies {
     implementation 'cn.yc:ToolLib:1.2.0'
 
     //api 'com.otaliastudios:cameraview:2.6.4'
+
+    // 裁剪图片
+    //implementation 'com.github.yalantis:ucrop:2.2.6'
+    api 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
 }

+ 6 - 2
app/src/main/AndroidManifest.xml

@@ -9,6 +9,7 @@
 
 
     <uses-permission android:name="android.permission.CAMERA" />
+
     <uses-feature android:name="android.hardware.camera2.full" />
     <uses-feature android:name="android.hardware.camera.any" />
     <uses-feature android:name="android.hardware.camera" />
@@ -59,10 +60,13 @@
 
         <activity
             android:name=".ui.camera.otalia.OtaOperationActivity"
-            android:screenOrientation="portrait"
             android:configChanges="keyboardHidden|orientation|screenSize"
-            android:launchMode="singleTask"/>
+            android:launchMode="singleTask"
+            android:screenOrientation="portrait" />
 
+        <activity
+            android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
+            android:theme="@style/Base.Theme.AppCompat" />
     </application>
 
 </manifest>

+ 27 - 24
app/src/main/java/com/miekir/ocr/OCRApplication.java

@@ -2,6 +2,9 @@ package com.miekir.ocr;
 
 import android.app.Application;
 
+import com.yc.toollib.crash.CrashHandler;
+import com.yc.toollib.crash.CrashListener;
+
 import rx_activity_result2.RxActivityResult;
 
 
@@ -24,29 +27,29 @@ public class OCRApplication extends Application {
 
         RxActivityResult.register(this);
 
-//        CrashHandler.getInstance().init(this, new CrashListener() {
-//            /**
-//             * 重启app
-//             */
-//            @Override
-//            public void againStartApp() {
-//                //CrashToolUtils.reStartApp1(App.this,1000);
-//                //CrashToolUtils.reStartApp2(App.this,1000, MainActivity.class);
-//                //CrashToolUtils.reStartApp3(AppManager.getAppManager().currentActivity());
-//            }
-//
-//            /**
-//             * 自定义上传crash,支持开发者上传自己捕获的crash数据
-//             * @param ex                        ex
-//             */
-//            @Override
-//            public void recordException(Throwable ex) {
-//                //崩溃文件存储路径:/storage/emulated/0/Android/data/你的包名/cache/crashLogs
-//                //崩溃文件存储路径:/storage/emulated/0/Android/data/com.miekir.ocr/cache/crashLogs
-//                //崩溃页面截图存储路径:/storage/emulated/0/Android/data/你的包名/cache/crashPics
-//                //自定义上传crash,支持开发者上传自己捕获的crash数据
-//                //StatService.recordException(getApplication(), ex);
-//            }
-//        });
+        CrashHandler.getInstance().init(this, new CrashListener() {
+            /**
+             * 重启app
+             */
+            @Override
+            public void againStartApp() {
+                //CrashToolUtils.reStartApp1(App.this,1000);
+                //CrashToolUtils.reStartApp2(App.this,1000, MainActivity.class);
+                //CrashToolUtils.reStartApp3(AppManager.getAppManager().currentActivity());
+            }
+
+            /**
+             * 自定义上传crash,支持开发者上传自己捕获的crash数据
+             * @param ex                        ex
+             */
+            @Override
+            public void recordException(Throwable ex) {
+                //崩溃文件存储路径:/storage/emulated/0/Android/data/你的包名/cache/crashLogs
+                //崩溃文件存储路径:/storage/emulated/0/Android/data/com.miekir.ocr/cache/crashLogs
+                //崩溃页面截图存储路径:/storage/emulated/0/Android/data/你的包名/cache/crashPics
+                //自定义上传crash,支持开发者上传自己捕获的crash数据
+                //StatService.recordException(getApplication(), ex);
+            }
+        });
     }
 }

+ 26 - 18
app/src/main/java/com/miekir/ocr/ui/OperationPresenter.java

@@ -26,7 +26,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import id.zelory.compressor.Compressor;
 import io.reactivex.Observable;
 import io.reactivex.ObservableEmitter;
 import io.reactivex.ObservableOnSubscribe;
@@ -49,7 +48,7 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
      * @param uri     图片
      * @param scene   识别场景类型
      */
-    public void startOcrFromUri(Context context, Uri uri, String scene, boolean isLandscape) {
+    public void startOcrFromUri(Context context, Uri uri, String scene, boolean isLandscape, boolean isFromRawCamera) {
         getView().showLoading(context.getResources().getString(R.string.loading));
         Observable.create(new ObservableOnSubscribe<String>() {
             @Override
@@ -59,9 +58,11 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                 // 这个如果是竖屏拍的照片,需要顺时针旋转90度才正常
                 Bitmap rawBitmap = ImageUtil.getBitmapFromUri(context, uri);
                 String filePath = ImageOrientation.getPath(context, uri);
+                MediaScannerConnection.scanFile(context, new String[] { filePath }, new String[] { "image/jpeg" }, null);
+
                 // 肉眼看见的Bitmap
-                Bitmap viewedBitmap = null;
-                if (!TextUtils.isEmpty(filePath)) {
+                Bitmap viewedBitmap = rawBitmap;
+                if (!TextUtils.isEmpty(filePath) && !isFromRawCamera) {
                     viewedBitmap = ImageOrientation.modifyOrientation(filePath, rawBitmap);
                 }
 
@@ -74,7 +75,7 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                     }
                 } else {
                     Bitmap rotatedBitmap = viewedBitmap;
-                    if (isLandscape) {
+                    if (!isFromRawCamera && isLandscape) {
                         rotatedBitmap = ImageUtil.rotateBitmap(viewedBitmap, -90);
                         viewedBitmap.recycle();
                     }
@@ -96,23 +97,21 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
 
                         rotatedBitmap.recycle();
                         if (saveCropSuccess) {
-//                            List<File> fileList = Luban.with(context)
-//                                    .load(file)
-//                                    .ignoreBy(400)
-//                                    .setTargetDir(file.getParentFile().getAbsolutePath())
-//                                    .get();
-//                            File compressedFile = fileList.get(0);
-
-                            File compressedFile = file;
+                            List<File> fileList = Luban.with(context)
+                                    .load(file)
+                                    .ignoreBy(400)
+                                    .setTargetDir(file.getParentFile().getAbsolutePath())
+                                    .get();
+                            File compressedFile = fileList.get(0);
+
+                            /*File compressedFile = file;
                             if (file.length() > 400 * 1024) {
                                 compressedFile = new Compressor(context.getApplicationContext())
                                         .setQuality(90)
                                         .setDestinationDirectoryPath(file.getParentFile().getAbsolutePath())
                                         .compressToFile(file, "cp_" + file.getName());
-                            }
+                            }*/
 
-                            // 通知相册去获取
-                            MediaScannerConnection.scanFile(context, new String[] { compressedFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
                             // 保存最终截图成功,根据URI获取图片的base64字符串
                             photoBase64 = Base64Tool.getBase64FromFilePath(compressedFile.getAbsolutePath());
 
@@ -121,11 +120,20 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                             }
 
                             //从相册选择图片上传的话,不要删除原图
+                            // 通知相册去获取
                             if (file != compressedFile) {
                                 file.delete();
-                                compressedFile.delete();
+                                if (!filePath.contains("cache")) {
+                                    compressedFile.delete();
+                                } else {
+                                    MediaScannerConnection.scanFile(context, new String[] { compressedFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
+                                }
                             } else {
-                                file.delete();
+                                if (!filePath.contains("cache")) {
+                                    file.delete();
+                                } else {
+                                    MediaScannerConnection.scanFile(context, new String[] { file.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
+                                }
                             }
 
                             if (TextUtils.isEmpty(photoBase64)) {

+ 0 - 210
app/src/main/java/com/miekir/ocr/ui/camera/oppo/OppoCameraActivity.java

@@ -1,210 +0,0 @@
-package com.miekir.ocr.ui.camera.oppo;
-
-import android.graphics.Bitmap;
-import android.graphics.PointF;
-import android.graphics.RectF;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.ImageView;
-
-import androidx.annotation.NonNull;
-
-import com.miekir.ocr.R;
-import com.miekir.ocr.base.BaseCameraActivity;
-import com.otaliastudios.cameraview.CameraListener;
-import com.otaliastudios.cameraview.CameraLogger;
-import com.otaliastudios.cameraview.CameraOptions;
-import com.otaliastudios.cameraview.CameraUtils;
-import com.otaliastudios.cameraview.CameraView;
-import com.otaliastudios.cameraview.PictureResult;
-import com.otaliastudios.cameraview.controls.Flash;
-import com.otaliastudios.cameraview.controls.Preview;
-import com.otaliastudios.cameraview.filter.Filters;
-import com.otaliastudios.cameraview.filter.MultiFilter;
-import com.otaliastudios.cameraview.filters.ContrastFilter;
-import com.otaliastudios.cameraview.filters.SharpnessFilter;
-import com.otaliastudios.cameraview.frame.Frame;
-import com.otaliastudios.cameraview.frame.FrameProcessor;
-
-/**
- * Copyright (C), 2019-2020, Miekir
- *
- * @author Miekir
- * @date 2020/10/29 15:14
- * Description:
- */
-public class OppoCameraActivity extends BaseCameraActivity {
-    protected CameraView camera;
-    private ImageView iv_flash;
-    private boolean mIsFlashOpen = false;
-    protected int mLeft;
-    protected int mTop;
-    protected int mRight;
-    protected int mBottom;
-
-    @Override
-    public int getLayoutID() {
-        return R.layout.activity_oppo;
-    }
-
-    @Override
-    public void initViews(Bundle savedInstanceState) {
-        camera = findViewById(R.id.camera);
-        setupCamera();
-
-        View fl_camera_size = findViewById(R.id.fl_camera_size);
-        fl_camera_size.post(new Runnable() {
-            @Override
-            public void run() {
-                // 设置拍照的分辨率
-                //AspectRatio ratio = AspectRatio.of(new Size(camera.getWidth(), camera.getHeight()));
-                /*AspectRatio ratio = AspectRatio.parse(camera.getWidth() + ":" + camera.getHeight());
-                SizeSelector matchRatio = SizeSelectors.aspectRatio(ratio, 50);
-                SizeSelector matchSize = new SizeSelector() {
-                    @NonNull
-                    @Override
-                    public List<Size> select(@NonNull List<Size> source) {
-                        List<Size> sizeList = new ArrayList<>();
-                        sizeList.add(new Size(camera.getWidth(), camera.getHeight()));
-                        return sizeList;
-                    }
-                };
-                SizeSelector matchAll = SizeSelectors.or(
-                        SizeSelectors.and(matchRatio, matchSize), // Try to respect both constraints.
-                        matchRatio, // If couldn't respect size, at least match aspect ratio
-                        matchSize, // If couldn't match aspect ratio, at least respect the size
-                        SizeSelectors.biggest() // If couldn't match any, take the biggest.
-                );
-                camera.setPictureSize(matchAll);*/
-
-
-                // 这两个方法只能设置小于屏幕分辨率的
-                //camera.setSnapshotMaxWidth(camera.getWidth() * 2 + 100);
-                //camera.setSnapshotMaxHeight(camera.getHeight() * 2 + 100);
-                // 高质量输出
-                //camera.setPictureSnapshotMetering(true);
-
-
-
-                setWidthHeight(camera.getWidth(), camera.getHeight());
-            }
-        });
-
-        camera.addFrameProcessor(new FrameProcessor() {
-            @Override
-            public void process(@NonNull Frame frame) {
-
-            }
-        });
-
-        iv_flash = findViewById(R.id.iv_flash);
-        iv_flash.setOnClickListener(v -> {
-            mIsFlashOpen = !mIsFlashOpen;
-            //mIsCapturing = false;
-            if (mIsFlashOpen) {
-                iv_flash.setImageResource(R.mipmap.flash_open);
-                camera.setFlash(Flash.OFF);
-            } else {
-                iv_flash.setImageResource(R.mipmap.flash_close);
-                camera.setFlash(Flash.OFF);
-            }
-        });
-    }
-
-    private void setupCamera() {
-        CameraLogger.setLogLevel(CameraLogger.LEVEL_ERROR);
-        camera.setLifecycleOwner(this);
-        camera.addCameraListener(new Listener());
-        camera.setPlaySounds(false);
-        camera.setSoundEffectsEnabled(false);
-        // 预览尺寸不要超过1920x1080,否则相机带宽吃紧,这也是Camera2 API的要求.
-        //camera.setPreviewStreamSize(SizeSelectors.biggest());将会卡顿
-        camera.close();
-        camera.open();
-        // 减少曝光
-        camera.post(new Runnable() {
-            @Override
-            public void run() {
-                CameraOptions options = camera.getCameraOptions();
-                if (options != null) {
-                    camera.setExposureCorrection(options.getExposureCorrectionMinValue()/5);
-                }
-            }
-        });
-
-        //camera.setWhiteBalance(WhiteBalance.CLOUDY);
-
-        //cameraView.setPictureSize { arrayListOf(Size(768, 1024)) }
-        //camera.setFilter(Filters.SHARPNESS.newInstance());
-        SharpnessFilter sharpnessFilter = (SharpnessFilter)Filters.SHARPNESS.newInstance();
-        //0~1.0
-        sharpnessFilter.setSharpness(0.06f);
-        ContrastFilter contrastFilter = (ContrastFilter)Filters.CONTRAST.newInstance();
-        //1.0~2.0
-        contrastFilter.setContrast(1.06f);
-
-        MultiFilter multiFilter = new MultiFilter(
-                sharpnessFilter,
-                contrastFilter
-        );
-        //camera.setFilter(multiFilter);
-        //camera.setHdr(Hdr.ON);
-    }
-
-    private boolean mIsCapturing = false;
-    protected boolean mIsUploading = false;
-    public void takePhoto() {
-        if (mIsUploading || mIsCapturing || camera.isTakingPicture()) {
-            return;
-        }
-        if (camera.getPreview() != Preview.GL_SURFACE) {
-            //Picture snapshots are only allowed with the GL_SURFACE preview.
-            return;
-        }
-
-        mIsUploading = true;
-
-        // 开始拍照,takePictureSnapshot不会触发闪光灯
-        if (mIsFlashOpen) {
-            mIsCapturing = true;
-            camera.setFlash(Flash.TORCH);
-            camera.startAutoFocus(new RectF(mLeft, mTop, mRight, mBottom));
-        } else {
-            camera.takePictureSnapshot();
-            //camera.takePicture();
-        }
-    }
-
-    class Listener extends CameraListener {
-        @Override
-        public void onAutoFocusEnd(boolean successful, @NonNull PointF point) {
-            super.onAutoFocusEnd(successful, point);
-            if (mIsCapturing) {
-                mIsCapturing = false;
-                camera.takePictureSnapshot();
-            }
-        }
-
-        @Override
-        public void onPictureTaken(@NonNull PictureResult result) {
-            super.onPictureTaken(result);
-
-            String extension;
-            switch (result.getFormat()) {
-                case JPEG:
-                    extension = ".jpg";
-                    break;
-                case DNG:
-                    extension = ".dng";
-                    break;
-                default:
-                    return;
-            }
-
-            camera.setFlash(Flash.OFF);
-            mIsCapturing = false;
-            Bitmap bitmap = CameraUtils.decodeBitmap(result.getData());
-            takePhotoResult(bitmap);
-        }
-    }
-}

+ 0 - 344
app/src/main/java/com/miekir/ocr/ui/camera/oppo/OppoOperationActivity.java

@@ -1,344 +0,0 @@
-package com.miekir.ocr.ui.camera.oppo;
-
-import android.app.AlertDialog;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Environment;
-import android.text.TextUtils;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.annotation.Nullable;
-
-import com.miekir.common.utils.SizeTool;
-import com.miekir.common.utils.ToastTool;
-import com.miekir.common.utils.ViewTool;
-import com.miekir.mvp.presenter.InjectPresenter;
-import com.miekir.ocr.R;
-import com.miekir.ocr.bean.OcrResult;
-import com.miekir.ocr.tool.AnimateManager;
-import com.miekir.ocr.tool.SystemTool;
-import com.miekir.ocr.ui.IOperationView;
-import com.miekir.ocr.ui.OperationPresenter;
-import com.miekir.ocr.widget.CropView;
-import com.miekir.ocr.widget.GlideV4ImageEngine;
-import com.miekir.ocr.widget.IndicatorText;
-import com.zhihu.matisse.Matisse;
-import com.zhihu.matisse.MimeType;
-
-import java.io.File;
-import java.util.List;
-
-import static android.os.Environment.DIRECTORY_PICTURES;
-
-/**
- * Copyright (C), 2019-2020, Genlot
- *
- * @author 詹子聪
- * @date 2020/7/27 9:01
- * Description: 菜单操作
- */
-public class OppoOperationActivity extends OppoCameraActivity implements CropView.OnRectChangeListener, View.OnClickListener, IOperationView {
-    private static final int REQUEST_CODE_CHOOSE = 6;
-
-    @InjectPresenter
-    OperationPresenter mOperationPresenter;
-
-    private int mCurrentType = CropView.SCAN_TYPE_ALL;
-    private String mCurrentScene = CropView.SCAN_SCENES[mCurrentType];
-    private int[] MENU_ID_LIST = {R.id.it_postal, R.id.it_address, R.id.it_name, R.id.it_all};
-
-    private TextView tv_orientation;
-    private String mLandscapeString;
-    private String mPortraitString;
-
-    private CropView pcv_scan;
-
-    @Override
-    public void initViews(Bundle savedInstanceState) {
-        super.initViews(savedInstanceState);
-
-        int[] clickIds = new int[]{R.id.it_postal, R.id.fl_take, R.id.it_address, R.id.it_name, R.id.it_all, R.id.fl_album};
-        ViewTool.setOnClickListener(this, clickIds, this);
-
-        // 裁剪View
-        pcv_scan = findViewById(R.id.pcv_scan);
-        pcv_scan.setLocationListener(this);
-        // debug,lambda可以回调,类实现接口可以回调,内部类可以回调,但是匿名内部类不行(实际上已经执行),估计是AS4的bug
-        pcv_scan.setOnFingerUpListener(event -> {
-            if (camera != null) {
-                camera.startAutoFocus(event.getX(), event.getY());
-            }
-        });
-
-        mLandscapeString = getResources().getString(R.string.landscape);
-        mPortraitString = getResources().getString(R.string.portrait);
-        tv_orientation = findViewById(R.id.tv_orientation);
-        tv_orientation.setOnClickListener(this);
-    }
-
-    @Override
-    public void onClick(View v) {
-        switch (v.getId()) {
-            case R.id.fl_take:
-                takePhoto();
-                break;
-            case R.id.fl_album:
-                Matisse.from(this)
-                        .choose(MimeType.ofImage())
-                        .countable(true)
-                        .maxSelectable(1)
-                        //.addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
-                        //.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
-                        .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
-                        .thumbnailScale(0.85f)
-                        //.imageEngine(new GlideEngine())
-                        .imageEngine(new GlideV4ImageEngine())
-                        //.showPreview(false) // Default is `true`
-                        .forResult(REQUEST_CODE_CHOOSE);
-                break;
-
-            case R.id.it_postal:
-            case R.id.it_address:
-            case R.id.it_name:
-            case R.id.it_all:
-                setScanArea(v.getId());
-                if (v.getId() == R.id.it_all) {
-                    tv_orientation.setText(mLandscapeString);
-                    tv_orientation.setVisibility(View.VISIBLE);
-                } else {
-                    tv_orientation.setVisibility(View.INVISIBLE);
-                }
-                break;
-
-            case R.id.tv_orientation:
-                String textOld = tv_orientation.getText().toString();
-                if (TextUtils.equals(mLandscapeString, textOld)) {
-                    tv_orientation.setText(mPortraitString);
-                } else {
-                    tv_orientation.setText(mLandscapeString);
-                }
-
-                if (tv_orientation.getVisibility() == View.VISIBLE) {
-                    // 切换横竖屏
-                    AnimateManager.getInstance().stopAnimation();
-                    pcv_scan.switchOrientation();
-                }
-                break;
-            default:
-                break;
-        }
-    }
-
-    /**
-     * 设置裁剪区域
-     * @param viewId
-     */
-    private void setScanArea(int viewId) {
-        for (int index = 0, len = MENU_ID_LIST.length; index < len; index++) {
-            IndicatorText indicatorText = findViewById(MENU_ID_LIST[index]);
-            if (MENU_ID_LIST[index] == viewId) {
-                indicatorText.onIndicatorClicked();
-                mCurrentType = CropView.SCAN_TYPES[index];
-                mCurrentScene = CropView.SCAN_SCENES[index];
-            } else {
-                indicatorText.onIndicatorRelease();
-            }
-        }
-        pcv_scan.setScanArea(mCurrentType);
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        pcv_scan.setLocationListener(null);
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CHOOSE && data != null) {
-            List<Uri> selectedList = Matisse.obtainResult(data);
-            if (selectedList != null && selectedList.size() > 0) {
-                if (tv_orientation.getVisibility() == View.VISIBLE) {
-                    mOperationPresenter.startOcrFromUri(this, selectedList.get(0), mCurrentScene, pcv_scan.isLandscape());
-                } else {
-                    mOperationPresenter.startOcrFromUri(this, selectedList.get(0), mCurrentScene, false);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void locationRect(int startX, int startY, int endX, int endY) {
-        // 截取的区域坐标信息
-        mLeft = startX;
-        mTop = startY;
-        mRight = endX;
-        mBottom = endY;
-        if (mLeft <= 0) {
-            mLeft = 0;
-            mRight += startX;
-        }
-
-        if (mLeft + mRight > SizeTool.SCREEN_WIDTH) {
-            mRight = SizeTool.SCREEN_WIDTH - mLeft;
-        }
-
-        if (mTop <= 0) {
-            mTop = 0;
-            mBottom += startY;
-        }
-
-        if (mTop + mBottom > SizeTool.SCREEN_HEIGHT) {
-            mBottom = SizeTool.SCREEN_HEIGHT - mTop;
-        }
-    }
-
-    @Override
-    public void onOcrResult(OcrResult result) {
-        // 识别结果
-        showResultDialog(result);
-    }
-
-    private AlertDialog dialog;
-    /**
-     * 弹出识别对话框
-     * @param result
-     */
-    private void showResultDialog(OcrResult result) {
-        if (dialog != null && dialog.isShowing()) {
-            return;
-        }
-        mIsUploading = false;
-        dialog = new AlertDialog.Builder(this).setView(R.layout.dialog_result).create();
-        dialog.show();
-        dialog.setCancelable(false);
-        dialog.setCanceledOnTouchOutside(false);
-
-        dialog.findViewById(R.id.tv_copy).setOnClickListener(v -> {
-            dialog.cancel();
-            if (result == null) {
-                return;
-            }
-
-            SystemTool.copyText(OppoOperationActivity.this, "");
-            // 复制全部识别信息
-            if (mCurrentType == CropView.SCAN_TYPE_ALL) {
-                StringBuilder builder = new StringBuilder();
-                if (result.postcode != null) {
-                    builder.append(result.postcode.getText()).append(",");
-                }
-                if (result.address != null) {
-                    builder.append(result.address.getText()).append(",");
-                }
-                if (result.name != null) {
-                    builder.append(result.name.getText()).append(",");
-                }
-                if (builder.length() > 0) {
-                    builder.deleteCharAt(builder.length()-1);
-                    SystemTool.copyText(OppoOperationActivity.this, builder.toString());
-                } else {
-                    SystemTool.copyText(OppoOperationActivity.this, " ");
-                }
-            } else if (mCurrentType == CropView.SCAN_TYPE_POSTAL) {
-                if (result.postcode != null) {
-                    SystemTool.copyText(OppoOperationActivity.this, result.postcode.getText());
-                } else {
-                    SystemTool.copyText(OppoOperationActivity.this, " ");
-                }
-            } else if (mCurrentType == CropView.SCAN_TYPE_ADDRESS) {
-                if (result.address != null) {
-                    SystemTool.copyText(OppoOperationActivity.this, result.address.getText());
-                } else {
-                    SystemTool.copyText(OppoOperationActivity.this, " ");
-                }
-            } else if (mCurrentType == CropView.SCAN_TYPE_NAME) {
-                if (result.name != null) {
-                    SystemTool.copyText(OppoOperationActivity.this, result.name.getText());
-                } else {
-                    SystemTool.copyText(OppoOperationActivity.this, " ");
-                }
-            }
-
-            ToastTool.showShort(getString(R.string.copy_success));
-        });
-        dialog.findViewById(R.id.tv_cancel).setOnClickListener(v -> {
-            dialog.cancel();
-        });
-
-        LinearLayout ll_postal = dialog.findViewById(R.id.ll_postal);
-        LinearLayout ll_address = dialog.findViewById(R.id.ll_address);
-        LinearLayout ll_name = dialog.findViewById(R.id.ll_name);
-        if (mCurrentType == CropView.SCAN_TYPE_ALL) {
-            ll_postal.setVisibility(View.VISIBLE);
-            ll_address.setVisibility(View.VISIBLE);
-            ll_name.setVisibility(View.VISIBLE);
-        } else if (mCurrentType == CropView.SCAN_TYPE_POSTAL) {
-            ll_postal.setVisibility(View.VISIBLE);
-            ll_address.setVisibility(View.GONE);
-            ll_name.setVisibility(View.GONE);
-        } else if (mCurrentType == CropView.SCAN_TYPE_ADDRESS) {
-            ll_address.setVisibility(View.VISIBLE);
-            ll_postal.setVisibility(View.GONE);
-            ll_name.setVisibility(View.GONE);
-
-        } else if (mCurrentType == CropView.SCAN_TYPE_NAME) {
-            ll_name.setVisibility(View.VISIBLE);
-            ll_postal.setVisibility(View.GONE);
-            ll_address.setVisibility(View.GONE);
-        }
-
-        TextView tv_postal = dialog.findViewById(R.id.tv_postal);
-        TextView tv_address = dialog.findViewById(R.id.tv_address);
-        TextView tv_name = dialog.findViewById(R.id.tv_name);
-        tv_postal.setText("");
-        tv_address.setText("");
-        tv_name.setText("");
-
-
-        if (result == null) {
-            return;
-        }
-
-        if (result.postcode != null) {
-            tv_postal.setText(result.postcode.getText());
-        }
-
-        if (result.address != null) {
-            tv_address.setText(result.address.getText());
-        }
-
-        if (result.name != null) {
-            tv_name.setText(result.name.getText());
-        }
-    }
-
-    @Override
-    protected void takePhotoResult(Bitmap bitmap) {
-        super.takePhotoResult(bitmap);
-        if (bitmap == null) {
-            return;
-        }
-        // 得到裁剪后的图片数据
-        int[] rectData = new int[]{mLeft, mTop, mRight, mBottom};
-        File file = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES) + "/" + System.currentTimeMillis() + ".jpg");
-        if (!file.getParentFile().exists()) {
-            file.getParentFile().mkdirs();
-        }
-        if (tv_orientation.getVisibility() == View.VISIBLE) {
-            mOperationPresenter.startOcrFromBitmap(this, bitmap, rectData, file, mCurrentScene, pcv_scan.isLandscape());
-        } else {
-            mOperationPresenter.startOcrFromBitmap(this, bitmap, rectData, file, mCurrentScene, false);
-        }
-    }
-
-    @Override
-    protected void setWidthHeight(int width, int height) {
-        mOperationPresenter.setWidthHeight(width, height);
-    }
-}

+ 23 - 49
app/src/main/java/com/miekir/ocr/ui/camera/otalia/OtaCameraActivity.java

@@ -20,11 +20,8 @@ import androidx.core.content.FileProvider;
 
 import com.miekir.ocr.R;
 import com.miekir.ocr.base.BaseCameraActivity;
-import com.miekir.ocr.tool.ImageOrientation;
-import com.miekir.ocr.tool.ImageUtil;
 import com.otaliastudios.cameraview.CameraListener;
 import com.otaliastudios.cameraview.CameraLogger;
-import com.otaliastudios.cameraview.CameraOptions;
 import com.otaliastudios.cameraview.CameraUtils;
 import com.otaliastudios.cameraview.CameraView;
 import com.otaliastudios.cameraview.PictureResult;
@@ -36,9 +33,9 @@ import com.otaliastudios.cameraview.filters.ContrastFilter;
 import com.otaliastudios.cameraview.filters.SharpnessFilter;
 import com.otaliastudios.cameraview.frame.Frame;
 import com.otaliastudios.cameraview.frame.FrameProcessor;
+import com.theartofdev.edmodo.cropper.CropImage;
 
 import java.io.File;
-import java.io.IOException;
 
 import static android.os.Environment.DIRECTORY_PICTURES;
 
@@ -50,6 +47,8 @@ import static android.os.Environment.DIRECTORY_PICTURES;
  * Description:
  */
 public class OtaCameraActivity extends BaseCameraActivity {
+    private static final int REQUEST_CODE_RAW_CAMERA = 6;
+
     protected CameraView camera;
     private ImageView iv_flash;
     private boolean mIsFlashOpen = false;
@@ -105,12 +104,12 @@ public class OtaCameraActivity extends BaseCameraActivity {
         camera.close();
         camera.open();
         // 减少曝光
-        camera.post(() -> {
-            CameraOptions options = camera.getCameraOptions();
-            if (options != null) {
-                camera.setExposureCorrection(options.getExposureCorrectionMinValue()/5);
-            }
-        });
+//        camera.post(() -> {
+//            CameraOptions options = camera.getCameraOptions();
+//            if (options != null) {
+//                camera.setExposureCorrection(options.getExposureCorrectionMinValue()/5);
+//            }
+//        });
 
 
         SharpnessFilter sharpnessFilter = (SharpnessFilter)Filters.SHARPNESS.newInstance();
@@ -218,7 +217,7 @@ public class OtaCameraActivity extends BaseCameraActivity {
         new Handler().postDelayed(new Runnable() {
             @Override
             public void run() {
-                startActivityForResult(takeIntent, 6);
+                startActivityForResult(takeIntent, REQUEST_CODE_RAW_CAMERA);
             }
         }, 1000);
     }
@@ -228,16 +227,16 @@ public class OtaCameraActivity extends BaseCameraActivity {
         super.onActivityResult(requestCode, resultCode, data);
         mIsRawOpen = false;
         if (resultCode == RESULT_OK) {
-            if (requestCode == 6) {
-                correctPhotoRotation(tempRawPhotoFile, mImageCaptureUri);
+            if (requestCode == REQUEST_CODE_RAW_CAMERA) {
+                //correctPhotoRotation(tempRawPhotoFile, mImageCaptureUri);
                 // 通知相册去获取
-                //MediaScannerConnection.scanFile(this, new String[] { tempRawPhotoFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
-                //cropPhoto(tempRawPhotoFile, getNewUri(tempRawPhotoFile));
+                MediaScannerConnection.scanFile(this, new String[] { tempRawPhotoFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
+                cropPhoto(tempRawPhotoFile, getNewUri(tempRawPhotoFile));
             }
 
-            if (requestCode == 9) {
-                // 通知相册去获取
-                MediaScannerConnection.scanFile(this, new String[] { croppedFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
+            if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
+                CropImage.ActivityResult result = CropImage.getActivityResult(data);
+                Uri croppedPhotoUri = result.getUri();
                 onOppoResult(croppedPhotoUri);
             }
         } else {
@@ -249,38 +248,13 @@ public class OtaCameraActivity extends BaseCameraActivity {
         return FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", file);
     }
 
-    private void correctPhotoRotation(File imageFile, Uri imageUri) {
-        //Bitmap rawBitmap = ImageUtil.getBitmapFromUri(this, Uri.fromFile(imageFile));
-        Bitmap rawBitmap = ImageUtil.getBitmapFromUri(this, mImageCaptureUri);
-        boolean correctSuccess = true;
-        try {
-            rawBitmap = ImageOrientation.modifyOrientation(imageFile.getAbsolutePath(), rawBitmap);
-        } catch (IOException e) {
-            e.printStackTrace();
-            correctSuccess = false;
-        }
 
-        if (correctSuccess) {
-            boolean saveSuccess = ImageUtil.saveBitmapFile(rawBitmap, imageFile);
-            if (saveSuccess) {
-                // 通知相册去获取
-                MediaScannerConnection.scanFile(this, new String[] { tempRawPhotoFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
-                cropPhoto(tempRawPhotoFile, getNewUri(tempRawPhotoFile));
-            } else {
-                camera.open();
-            }
-        } else {
-            camera.open();
-        }
-    }
-
-    private Uri croppedPhotoUri;
-    private File croppedFile;
     private void cropPhoto(File file, Uri rawFileUri) {
-        croppedFile = new File(file.getParentFile().getAbsolutePath(), "crop_" + file.getName());
+        camera.close();
+
         // 这里必须用这个,否则无法裁剪
-        croppedPhotoUri = Uri.fromFile(croppedFile);
-        Intent intent = new Intent("com.android.camera.action.CROP");
+        //croppedPhotoUri = Uri.fromFile(croppedFile);
+        /*Intent intent = new Intent("com.android.camera.action.CROP");
         intent.setDataAndType(rawFileUri, "image/*");
         intent.putExtra("crop", "true");//可裁剪
         //intent.putExtra("aspectX", 1); //裁剪的宽比例
@@ -293,9 +267,9 @@ public class OtaCameraActivity extends BaseCameraActivity {
         intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//裁剪成的图片的格式
         // 让系统打开文件
         intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        startActivityForResult(intent, 9);*/
 
-        camera.close();
-        startActivityForResult(intent, 9);
+        CropImage.activity(rawFileUri).start(this);
     }
 
     protected void onOppoResult(Uri uri) {

+ 5 - 5
app/src/main/java/com/miekir/ocr/ui/camera/otalia/OtaOperationActivity.java

@@ -43,7 +43,7 @@ import static android.os.Environment.DIRECTORY_PICTURES;
  * Description: 菜单操作
  */
 public class OtaOperationActivity extends OtaCameraActivity implements CropView.OnRectChangeListener, View.OnClickListener, IOperationView {
-    private static final int REQUEST_CODE_CHOOSE = 6;
+    private static final int REQUEST_CODE_CHOOSE = 66;
 
     @InjectPresenter
     OperationPresenter mOperationPresenter;
@@ -165,9 +165,9 @@ public class OtaOperationActivity extends OtaCameraActivity implements CropView.
             List<Uri> selectedList = Matisse.obtainResult(data);
             if (selectedList != null && selectedList.size() > 0) {
                 if (tv_orientation.getVisibility() == View.VISIBLE) {
-                    mOperationPresenter.startOcrFromUri(this, selectedList.get(0), mCurrentScene, pcv_scan.isLandscape());
+                    mOperationPresenter.startOcrFromUri(this, selectedList.get(0), mCurrentScene, pcv_scan.isLandscape(), false);
                 } else {
-                    mOperationPresenter.startOcrFromUri(this, selectedList.get(0), mCurrentScene, false);
+                    mOperationPresenter.startOcrFromUri(this, selectedList.get(0), mCurrentScene, false, false);
                 }
             }
         }
@@ -346,9 +346,9 @@ public class OtaOperationActivity extends OtaCameraActivity implements CropView.
     protected void onOppoResult(Uri uri) {
         super.onOppoResult(uri);
         if (tv_orientation.getVisibility() == View.VISIBLE) {
-            mOperationPresenter.startOcrFromUri(this, uri, mCurrentScene, pcv_scan.isLandscape());
+            mOperationPresenter.startOcrFromUri(this, uri, mCurrentScene, pcv_scan.isLandscape(), true);
         } else {
-            mOperationPresenter.startOcrFromUri(this, uri, mCurrentScene, false);
+            mOperationPresenter.startOcrFromUri(this, uri, mCurrentScene, false, true);
         }
     }
 }