Browse Source

初步集成

詹子聪 5 years ago
parent
commit
0c9cdc487a

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

@@ -54,6 +54,12 @@
             android:name=".ui.camera.wechat.WechatOperationActivity"
             android:screenOrientation="portrait" />
 
+        <activity
+            android:name=".ui.camera.otalia.OtaOperationActivity"
+            android:screenOrientation="portrait"
+            android:configChanges="keyboardHidden|orientation|screenSize"
+            />
+
         <activity
             android:name=".ui.camera.google.GoogleCameraActivity"
             android:screenOrientation="portrait"

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

@@ -2,9 +2,6 @@ package com.miekir.ocr;
 
 import android.app.Application;
 
-import com.yc.toollib.crash.CrashHandler;
-import com.yc.toollib.crash.CrashListener;
-
 
 /**
  *
@@ -19,29 +16,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);
+//            }
+//        });
     }
 }

+ 3 - 2
app/src/main/java/com/miekir/ocr/PermissionActivity.java

@@ -10,7 +10,7 @@ import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;
 
-import com.miekir.ocr.ui.camera.wechat.WechatOperationActivity;
+import com.miekir.ocr.ui.camera.otalia.OtaOperationActivity;
 import com.tbruyelle.rxpermissions2.RxPermissions;
 
 
@@ -36,7 +36,8 @@ public class PermissionActivity extends AppCompatActivity {
                         //startActivity(new Intent(PermissionActivity.this, CropImageActivity.class));
 
 //                        startActivity(new Intent(PermissionActivity.this, OperationActivity.class));
-                        startActivity(new Intent(PermissionActivity.this, WechatOperationActivity.class));
+//                        startActivity(new Intent(PermissionActivity.this, WechatOperationActivity.class));
+                        startActivity(new Intent(PermissionActivity.this, OtaOperationActivity.class));
                         finish();
                         //photoSelect();
                     } else {

+ 8 - 0
app/src/main/java/com/miekir/ocr/base/BaseCameraActivity.java

@@ -1,5 +1,7 @@
 package com.miekir.ocr.base;
 
+import android.graphics.Bitmap;
+
 import com.miekir.mvp.view.BaseMVPActivity;
 
 /**
@@ -10,5 +12,11 @@ import com.miekir.mvp.view.BaseMVPActivity;
  */
 public abstract class BaseCameraActivity extends BaseMVPActivity {
 
+    protected void takePhotoResult(Bitmap bitmap) {
+
+    }
+
+    protected void setWidthHeight(int width, int height) {
 
+    }
 }

+ 2 - 1
app/src/main/java/com/miekir/ocr/ui/camera/CameraActivity.java

@@ -1,4 +1,4 @@
-package com.miekir.ocr.ui.camera;
+package com.miekir.ocr.ui;
 
 import android.Manifest;
 import android.annotation.SuppressLint;
@@ -170,6 +170,7 @@ public class CameraActivity extends BaseCameraActivity {
         });
     }
 
+    @Override
     protected void setWidthHeight(int width, int height) {
 
     }

+ 1 - 2
app/src/main/java/com/miekir/ocr/ui/OperationActivity.java

@@ -19,7 +19,6 @@ 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.camera.CameraActivity;
 import com.miekir.ocr.widget.CropView;
 import com.miekir.ocr.widget.GlideV4ImageEngine;
 import com.miekir.ocr.widget.IndicatorText;
@@ -36,7 +35,7 @@ import java.util.List;
  * @date 2020/7/27 9:01
  * Description: 菜单操作
  */
-public class OperationActivity extends CameraActivity implements CropView.onLocationListener, View.OnClickListener, IOperationView {
+public class OperationActivity extends CameraActivity implements CropView.OnRectChangeListener, View.OnClickListener, IOperationView {
     private static final int REQUEST_CODE_CHOOSE = 6;
 
     @InjectPresenter

+ 93 - 0
app/src/main/java/com/miekir/ocr/ui/camera/otalia/OtaCameraActivity.java

@@ -0,0 +1,93 @@
+package com.miekir.ocr.ui.camera.otalia;
+
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.view.View;
+
+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.CameraUtils;
+import com.otaliastudios.cameraview.CameraView;
+import com.otaliastudios.cameraview.PictureResult;
+import com.otaliastudios.cameraview.controls.Preview;
+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 OtaCameraActivity extends BaseCameraActivity {
+    private CameraView camera;
+
+    @Override
+    public int getLayoutID() {
+        return R.layout.activity_otalia_camera;
+    }
+
+    @Override
+    public void initViews(Bundle savedInstanceState) {
+        camera = findViewById(R.id.camera);
+        CameraLogger.setLogLevel(CameraLogger.LEVEL_VERBOSE);
+        camera.setLifecycleOwner(this);
+        camera.addCameraListener(new Listener());
+
+        View fl_camera_size = findViewById(R.id.fl_camera_size);
+        fl_camera_size.post(new Runnable() {
+            @Override
+            public void run() {
+                setWidthHeight(camera.getWidth(), camera.getHeight());
+            }
+        });
+
+        camera.addFrameProcessor(new FrameProcessor() {
+            @Override
+            public void process(@NonNull Frame frame) {
+
+            }
+        });
+    }
+
+    public void takePhoto() {
+        if (camera.isTakingPicture()) {
+            return;
+        }
+        if (camera.getPreview() != Preview.GL_SURFACE) {
+            //Picture snapshots are only allowed with the GL_SURFACE preview.
+            return;
+        }
+
+        // 开始拍照
+        camera.takePictureSnapshot();
+    }
+
+    class Listener extends CameraListener {
+
+        @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;
+            }
+
+            Bitmap bitmap = CameraUtils.decodeBitmap(result.getData());
+            takePhotoResult(bitmap);
+        }
+    }
+}

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

@@ -0,0 +1,330 @@
+package com.miekir.ocr.ui.camera.otalia;
+
+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.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 OtaOperationActivity extends OtaCameraActivity 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;
+
+    protected CropView pcv_scan;
+    protected int mLeft;
+    protected int mTop;
+    protected int mRight;
+    protected int mBottom;
+
+    @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);
+        //showResultDialog(null);
+        //showLoading("Loading...");
+
+        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) {
+        // 截取的区域坐标信息
+        //System.out.println("x:"+startX + "   y:" + startY + "    endX:" + endX + "   endY" + endY);
+        /*mLeft = startY;
+        mTop = SizeTool.SCREEN_WIDTH - endX;
+        mRight = endY;
+        mBottom = SizeTool.SCREEN_WIDTH - startX;*/
+
+        mLeft = startX;
+        mTop = startY;
+        mRight = endX;
+        mBottom = endY;
+
+        /*mLeft = startY;
+        mTop = SizeTool.SCREEN_WIDTH - endX;
+        mRight = endY;
+        mBottom = SizeTool.SCREEN_WIDTH - startX;*/
+    }
+
+    @Override
+    public void onOcrResult(OcrResult result) {
+        // 识别结果
+        showResultDialog(result);
+    }
+
+    /**
+     * 弹出识别对话框
+     * @param result
+     */
+    private void showResultDialog(OcrResult result) {
+        AlertDialog 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(OtaOperationActivity.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(OtaOperationActivity.this, builder.toString());
+                } else {
+                    SystemTool.copyText(OtaOperationActivity.this, " ");
+                }
+            } else if (mCurrentType == CropView.SCAN_TYPE_POSTAL) {
+                if (result.postcode != null) {
+                    SystemTool.copyText(OtaOperationActivity.this, result.postcode.getText());
+                } else {
+                    SystemTool.copyText(OtaOperationActivity.this, " ");
+                }
+            } else if (mCurrentType == CropView.SCAN_TYPE_ADDRESS) {
+                if (result.address != null) {
+                    SystemTool.copyText(OtaOperationActivity.this, result.address.getText());
+                } else {
+                    SystemTool.copyText(OtaOperationActivity.this, " ");
+                }
+            } else if (mCurrentType == CropView.SCAN_TYPE_NAME) {
+                if (result.name != null) {
+                    SystemTool.copyText(OtaOperationActivity.this, result.name.getText());
+                } else {
+                    SystemTool.copyText(OtaOperationActivity.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 (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);
+    }
+}

+ 0 - 8
app/src/main/java/com/miekir/ocr/ui/camera/wechat/WechatCameraActivity.java

@@ -158,12 +158,4 @@ public class WechatCameraActivity extends BaseCameraActivity {
         super.onPause();
         jCameraView.onPause();
     }
-
-    protected void takePhotoResult(Bitmap bitmap) {
-
-    }
-
-    protected void setWidthHeight(int width, int height) {
-
-    }
 }

+ 1 - 1
app/src/main/java/com/miekir/ocr/ui/camera/wechat/WechatOperationActivity.java

@@ -41,7 +41,7 @@ import static android.os.Environment.DIRECTORY_PICTURES;
  * @date 2020/7/27 9:01
  * Description: 菜单操作
  */
-public class WechatOperationActivity extends WechatCameraActivity implements CropView.onLocationListener, View.OnClickListener, IOperationView {
+public class WechatOperationActivity extends WechatCameraActivity implements CropView.OnRectChangeListener, View.OnClickListener, IOperationView {
     private static final int REQUEST_CODE_CHOOSE = 6;
 
     @InjectPresenter

+ 8 - 8
app/src/main/java/com/miekir/ocr/widget/CropView.java

@@ -32,9 +32,9 @@ public class CropView extends View {
     public static final int[] SCAN_TYPES = {SCAN_TYPE_POSTAL, SCAN_TYPE_ADDRESS, SCAN_TYPE_NAME, SCAN_TYPE_ALL};
     private static final String TAG = "CropView";
 
-    private onLocationListener locationListener;/*listen to the Rect */
+    private OnRectChangeListener locationListener;/*listen to the Rect */
     /*listening position changed */
-    private onChangeLocationlistener changeLocationlistener;
+    //private OnLocationChangeListener changeLocationlistener;
 
     private int MODE;
     private static final int MODE_OUTSIDE = 0x000000aa;/*170*/
@@ -367,9 +367,9 @@ public class CropView extends View {
         switch (event.getAction()) {
             case MotionEvent.ACTION_DOWN:
                 AnimateManager.getInstance().stopAnimation();
-                if (changeLocationlistener != null) {
-                    changeLocationlistener.locationChange("change self");
-                }
+                //if (changeLocationlistener != null) {
+                //    changeLocationlistener.locationChange("change self");
+                //}
 
                 memonyX = (int) event.getX();
                 memonyY = (int) event.getY();
@@ -600,15 +600,15 @@ public class CropView extends View {
         }
     }
 
-    public void setLocationListener(onLocationListener locationListener) {
+    public void setLocationListener(OnRectChangeListener locationListener) {
         this.locationListener = locationListener;
     }
 
-    public interface onLocationListener {
+    public interface OnRectChangeListener {
         public void locationRect(int startX, int startY, int endX, int endY);
     }
 
-    public interface onChangeLocationlistener {
+    public interface OnLocationChangeListener {
         @SuppressWarnings("SameParameterValue")
         public void locationChange(String msg);
     }

+ 231 - 0
app/src/main/res/layout/activity_otalia_camera.xml

@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/activity_main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:keepScreenOn="true"
+    tools:ignore="MissingDefaultResource">
+    <!--屏幕常亮-->
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/colorPrimary"
+        android:gravity="center_vertical"
+        android:minHeight="64dp"
+        android:orientation="horizontal"
+        android:paddingStart="@dimen/margin_default"
+        android:paddingTop="@dimen/margin_ss"
+        android:paddingEnd="@dimen/margin_default"
+        android:paddingBottom="@dimen/margin_ss">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@mipmap/logo" />
+
+        <TextView
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:text="@string/app_name"
+            android:textColor="@color/white"
+            android:textSize="18sp"
+            android:visibility="invisible"/>
+
+        <ImageView
+            android:id="@+id/iv_flash"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@mipmap/flash_close"/>
+    </LinearLayout>
+
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/fl_camera_size">
+
+        <com.otaliastudios.cameraview.CameraView
+            android:id="@+id/camera"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:keepScreenOn="true"
+            app:cameraExperimental="true"
+            app:cameraEngine="camera2"
+            app:cameraPreview="glSurface"
+            app:cameraPlaySounds="true"
+            app:cameraGrid="off"
+            app:cameraFlash="auto"
+            app:cameraAudio="off"
+            app:cameraFacing="back"
+            app:cameraGestureTap="autoFocus"
+            app:cameraGestureLongTap="none"
+            app:cameraGesturePinch="none"
+            app:cameraGestureScrollHorizontal="filterControl1"
+            app:cameraGestureScrollVertical="exposureCorrection"
+            app:cameraMode="picture"
+            app:cameraUseDeviceOrientation="false"
+            app:cameraAutoFocusMarker="@string/cameraview_default_autofocus_marker">
+
+        </com.otaliastudios.cameraview.CameraView>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+            <FrameLayout
+                android:layout_width="wrap_content"
+                android:layout_height="0dp"
+                android:layout_weight="370">
+                <!--灰色遮罩-->
+                <com.miekir.ocr.widget.CropView
+                    android:id="@+id/pcv_scan"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"/>
+
+                <com.miekir.ocr.widget.ScalableImageView
+                    android:id="@+id/iv_animation"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:visibility="invisible"
+                    android:scaleType="fitXY"/>
+            </FrameLayout>
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="0.8dp"
+                android:background="@color/white"/>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="180"
+                android:orientation="vertical"
+                android:background="@color/black_transparent">
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal">
+
+                    <Space
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1" />
+
+                    <com.miekir.ocr.widget.IndicatorText
+                        android:id="@+id/it_postal"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        app:text="@string/postal_code" />
+
+                    <Space
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1" />
+
+                    <com.miekir.ocr.widget.IndicatorText
+                        android:id="@+id/it_address"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        app:text="@string/address"/>
+
+                    <Space
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1" />
+
+                    <com.miekir.ocr.widget.IndicatorText
+                        android:id="@+id/it_name"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        app:text="@string/name"/>
+
+                    <Space
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1" />
+
+                    <com.miekir.ocr.widget.IndicatorText
+                        android:id="@+id/it_all"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        app:text="@string/full"
+                        app:focused="true"/>
+
+                    <Space
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1" />
+                </LinearLayout>
+
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    android:paddingBottom="@dimen/margin_default">
+
+                    <RelativeLayout
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="1">
+
+                        <FrameLayout
+                            android:id="@+id/fl_album"
+                            android:foreground="@drawable/ripple_effect"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_centerInParent="true"
+                            android:padding="@dimen/margin_default">
+                            <ImageView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@mipmap/button_album"/>
+                        </FrameLayout>
+
+                    </RelativeLayout>
+
+                    <FrameLayout
+                        android:id="@+id/fl_take"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:foreground="@drawable/ripple_effect">
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center"
+                            android:src="@mipmap/button_take" />
+
+                        <ImageView
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center"
+                            android:src="@mipmap/button_take_out" />
+                    </FrameLayout>
+
+                    <TextView
+                        android:id="@+id/tv_orientation"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="@dimen/margin_default"
+                        android:layout_marginEnd="@dimen/margin_default"
+                        android:layout_weight="1"
+                        android:gravity="center"
+                        android:text="@string/landscape"
+                        android:textColor="@color/colorPrimary"
+                        android:textSize="@dimen/size_text_title_p"/>
+                </LinearLayout>
+            </LinearLayout>
+        </LinearLayout>
+    </FrameLayout>
+</LinearLayout>

+ 5 - 2
cameraview/src/main/java/com/otaliastudios/cameraview/internal/OrientationHelper.java

@@ -70,10 +70,12 @@ public class OrientationHelper {
                     deviceOrientation = 270;
                 }
 
-                if (deviceOrientation != mDeviceOrientation) {
+                /*if (deviceOrientation != mDeviceOrientation) {
                     mDeviceOrientation = deviceOrientation;
                     mCallback.onDeviceOrientationChanged(mDeviceOrientation);
-                }
+                }*/
+                mDeviceOrientation = 0;
+                mCallback.onDeviceOrientationChanged(mDeviceOrientation);
             }
         };
         if (Build.VERSION.SDK_INT >= 17) {
@@ -112,6 +114,7 @@ public class OrientationHelper {
             manager.registerDisplayListener(mDisplayOffsetListener, mHandler);
         }
         mDeviceOrientationListener.enable();
+        //mCallback.onDeviceOrientationChanged(0);
     }
 
     /**