Procházet zdrojové kódy

国际化与请求框架搭建

詹子聪 před 5 roky
rodič
revize
f200b765c9
25 změnil soubory, kde provedl 335 přidání a 35 odebrání
  1. 1 1
      app/src/main/AndroidManifest.xml
  2. 2 2
      app/src/main/java/com/miekir/ocr/PermissionActivity.java
  3. 23 0
      app/src/main/java/com/miekir/ocr/api/ApiService.java
  4. 27 0
      app/src/main/java/com/miekir/ocr/bean/BboxBean.java
  5. 53 0
      app/src/main/java/com/miekir/ocr/bean/CommonBean.java
  6. 13 0
      app/src/main/java/com/miekir/ocr/bean/OcrResult.java
  7. 84 0
      app/src/main/java/com/miekir/ocr/tool/Base64Tool.java
  8. 21 0
      app/src/main/java/com/miekir/ocr/tool/DateTool.java
  9. 1 1
      app/src/main/java/com/miekir/ocr/ui/CameraActivity.java
  10. 13 0
      app/src/main/java/com/miekir/ocr/ui/IOperationView.java
  11. 21 7
      app/src/main/java/com/miekir/ocr/ui/MenuActivity.java
  12. 27 0
      app/src/main/java/com/miekir/ocr/ui/OperationPresenter.java
  13. 1 1
      app/src/main/java/com/miekir/ocr/view/AutoFitTextureView.java
  14. 5 4
      app/src/main/java/com/miekir/ocr/view/CropView.java
  15. 1 1
      app/src/main/java/com/miekir/ocr/view/GlideV4ImageEngine.java
  16. 1 1
      app/src/main/java/com/miekir/ocr/view/IndicatorText.java
  17. 1 1
      app/src/main/java/com/miekir/ocr/view/crop/CropLayout.java
  18. 1 1
      app/src/main/java/com/miekir/ocr/view/crop/CustomDrawable.java
  19. 6 6
      app/src/main/res/layout/activity_camera.xml
  20. 2 2
      app/src/main/res/layout/view_crop.xml
  21. 15 0
      app/src/main/res/values-ja-rJP/strings.xml
  22. 0 0
      app/src/main/res/values-zh-rCN/strings.xml
  23. 1 1
      network/src/main/java/com/miekir/network/constant/RequestConst.java
  24. 1 1
      network/src/main/java/com/miekir/network/core/base/BaseObserver.java
  25. 14 5
      network/src/main/java/com/miekir/network/core/base/BaseResponse.java

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -27,7 +27,7 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".ui.MenuActivity"
+        <activity android:name=".ui.OperationActivity"
             android:screenOrientation="portrait"/>
     </application>
 

+ 2 - 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.MenuActivity;
+import com.miekir.ocr.ui.OperationActivity;
 import com.tbruyelle.rxpermissions2.RxPermissions;
 
 
@@ -35,7 +35,7 @@ public class PermissionActivity extends AppCompatActivity {
                         // 打开相机
                         //startActivity(new Intent(PermissionActivity.this, CropImageActivity.class));
 
-                        startActivity(new Intent(PermissionActivity.this, MenuActivity.class));
+                        startActivity(new Intent(PermissionActivity.this, OperationActivity.class));
                         finish();
                         //photoSelect();
                     } else {

+ 23 - 0
app/src/main/java/com/miekir/ocr/api/ApiService.java

@@ -0,0 +1,23 @@
+package com.miekir.ocr.api;
+
+import com.miekir.network.core.base.BaseResponse;
+
+import java.util.Map;
+
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.POST;
+
+/**
+ *
+ * @author 詹子聪
+ * @date 2020/7/27 11:08
+ * Description: 主接口
+ */
+public interface ApiService {
+    /**
+     * 获取识别结果
+     */
+    @POST("/api/jphandwritingocr/jpExpressHwOcr")
+    Observable<BaseResponse<Object>> getOcrResult(@Body Map<String, Object> body);
+}

+ 27 - 0
app/src/main/java/com/miekir/ocr/bean/BboxBean.java

@@ -0,0 +1,27 @@
+package com.miekir.ocr.bean;
+
+public class BboxBean {
+    /**
+     * x : 269.05462646484375
+     * y : 369.2231140136719
+     */
+
+    private double x;
+    private double y;
+
+    public double getX() {
+        return x;
+    }
+
+    public void setX(double x) {
+        this.x = x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public void setY(double y) {
+        this.y = y;
+    }
+}

+ 53 - 0
app/src/main/java/com/miekir/ocr/bean/CommonBean.java

@@ -0,0 +1,53 @@
+package com.miekir.ocr.bean;
+
+/**
+ *
+ * @author 詹子聪
+ * @date 2020/7/27 11:25
+ * Description: 地址
+ */
+public class CommonBean {
+
+    /**
+     * text : 千葉県市川市大和田
+     * bbox : [{"x":269.05462646484375,"y":369.2231140136719},{"x":778.1234130859375,"y":373.8360290527344},{"x":776.6666259765625,"y":519.3651733398438},{"x":267.597900390625,"y":514.7522583007812}]
+     * score : 93
+     */
+
+    private String text;
+    private int score;
+    //private List<BboxBean> bbox;
+    private Object bbox;
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public int getScore() {
+        return score;
+    }
+
+    public void setScore(int score) {
+        this.score = score;
+    }
+
+    /*public List<BboxBean> getBbox() {
+        return bbox;
+    }
+
+    public void setBbox(List<BboxBean> bbox) {
+        this.bbox = bbox;
+    }*/
+
+    public Object getBbox() {
+        return bbox;
+    }
+
+    public void setBbox(Object bbox) {
+        this.bbox = bbox;
+    }
+}

+ 13 - 0
app/src/main/java/com/miekir/ocr/bean/OcrResult.java

@@ -0,0 +1,13 @@
+package com.miekir.ocr.bean;
+
+/**
+ *
+ * @author 詹子聪
+ * @date 2020/7/27 11:27
+ * Description: 识别结果
+ */
+public class OcrResult {
+    private CommonBean address;
+    private CommonBean name;
+    private CommonBean postcode;
+}

+ 84 - 0
app/src/main/java/com/miekir/ocr/tool/Base64Tool.java

@@ -0,0 +1,84 @@
+package com.miekir.ocr.tool;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.util.Base64;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+
+/**
+ * @author 詹子聪
+ * @date 2020/7/27 15:40
+ * Description: 图片转Base64字符串
+ */
+public class Base64Tool {
+    private Base64Tool() {
+    }
+
+    /**
+     * 图片Uri转Base64
+     *
+     * @param context
+     * @param imageUri
+     * @return
+     */
+    public static String getBase64FromUri(Context context, Uri imageUri) {
+        String encodedString = "";
+        if (imageUri == null) {
+            return encodedString;
+        }
+
+        InputStream imageStream = null;
+        try {
+            imageStream = context.getContentResolver().openInputStream(imageUri);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            return encodedString;
+        }
+
+        final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
+        encodedString = bitmap2Base64(selectedImage);
+
+        return encodedString;
+    }
+
+    private static String bitmap2Base64(Bitmap bitmap) {
+        if (bitmap == null) {
+            return "";
+        }
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
+        byte[] b = baos.toByteArray();
+
+        //return Base64.encodeToString(b, Base64.DEFAULT);
+        return Base64.encodeToString(b, Base64.NO_WRAP);
+    }
+
+    /**
+     * 根据路径,图片转Base64
+     * @param path
+     * @return
+     */
+    public static String getBase64FromFilePath(String path) {
+        File imageFile = new File(path);
+        FileInputStream fis = null;
+        try {
+            fis = new FileInputStream(imageFile);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            return "";
+        }
+        Bitmap bm = BitmapFactory.decodeStream(fis);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
+        byte[] b = baos.toByteArray();
+
+        return Base64.encodeToString(b, Base64.NO_WRAP);
+    }
+}

+ 21 - 0
app/src/main/java/com/miekir/ocr/tool/DateTool.java

@@ -0,0 +1,21 @@
+package com.miekir.ocr.tool;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+
+/**
+ *
+ * @author 詹子聪
+ * @date 2020/7/27 11:35
+ * Description:
+ */
+public class DateTool {
+    private DateTool(){}
+    private static final String FORMAT_REQUEST = "YYYYMMDDHHmmssfff";
+    private static SimpleDateFormat mFormat = new SimpleDateFormat(FORMAT_REQUEST, Locale.getDefault());
+
+    public static String getRequestId() {
+        return mFormat.format(Calendar.getInstance(Locale.getDefault()).getTime());
+    }
+}

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

@@ -37,7 +37,7 @@ import androidx.annotation.NonNull;
 import com.miekir.ocr.R;
 import com.miekir.ocr.base.BaseCameraActivity;
 import com.miekir.ocr.tool.CameraPreviewTool;
-import com.miekir.ocr.view.AutoFitTextureView;
+import com.miekir.ocr.widget.AutoFitTextureView;
 
 import java.io.File;
 import java.io.FileNotFoundException;

+ 13 - 0
app/src/main/java/com/miekir/ocr/ui/IOperationView.java

@@ -0,0 +1,13 @@
+package com.miekir.ocr.ui;
+
+import com.miekir.mvp.view.IView;
+
+/**
+ *
+ * @author 詹子聪
+ * @date 2020/7/27 15:59
+ * Description: 事务回调
+ */
+public interface IOperationView extends IView {
+    void onOcrResult();
+}

+ 21 - 7
app/src/main/java/com/miekir/ocr/ui/MenuActivity.java

@@ -9,10 +9,11 @@ import android.view.View;
 import androidx.annotation.Nullable;
 
 import com.miekir.common.utils.ViewTool;
+import com.miekir.mvp.presenter.InjectPresenter;
 import com.miekir.ocr.R;
-import com.miekir.ocr.view.CropView;
-import com.miekir.ocr.view.GlideV4ImageEngine;
-import com.miekir.ocr.view.IndicatorText;
+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;
 
@@ -25,11 +26,15 @@ import java.util.List;
  * @date 2020/7/27 9:01
  * Description: 菜单操作
  */
-public class MenuActivity extends CameraActivity implements CropView.onLocationListener, View.OnClickListener {
+public class OperationActivity extends CameraActivity implements CropView.onLocationListener, View.OnClickListener, IOperationView {
     private static final int REQUEST_CODE_CHOOSE = 6;
 
+    @InjectPresenter
+    OperationPresenter mOperationPresenter;
+
     private CropView pcv_scan;
     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};
 
     @Override
@@ -83,6 +88,7 @@ public class MenuActivity extends CameraActivity implements CropView.onLocationL
             if (MENU_ID_LIST[index] == viewId) {
                 indicatorText.onIndicatorClicked();
                 mCurrentType = CropView.SCAN_TYPES[index];
+                mCurrentScene = CropView.SCAN_SCENES[index];
             } else {
                 indicatorText.onIndicatorRelease();
             }
@@ -90,12 +96,15 @@ public class MenuActivity extends CameraActivity implements CropView.onLocationL
         pcv_scan.setScanArea(mCurrentType);
     }
 
-    private List<Uri> mSelected;
+
     @Override
     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
-        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CHOOSE) {
-            mSelected = Matisse.obtainResult(data);
+        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CHOOSE && data != null) {
+            List<Uri> selectedList = Matisse.obtainResult(data);
+            if (selectedList != null && selectedList.size() > 0) {
+                mOperationPresenter.startOcrFromUri(this, selectedList.get(0), mCurrentScene);
+            }
         }
     }
 
@@ -103,4 +112,9 @@ public class MenuActivity extends CameraActivity implements CropView.onLocationL
     public void locationRect(int startX, int startY, int endX, int endY) {
         // 截取的区域坐标信息
     }
+
+    @Override
+    public void onOcrResult() {
+        // 识别结果
+    }
 }

+ 27 - 0
app/src/main/java/com/miekir/ocr/ui/OperationPresenter.java

@@ -0,0 +1,27 @@
+package com.miekir.ocr.ui;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.miekir.mvp.presenter.BasePresenter;
+
+/**
+ *
+ * @author 詹子聪
+ * @date 2020/7/27 15:53
+ * Description: 操作的事务
+ */
+public class OperationPresenter extends BasePresenter<IOperationView> {
+
+    /**
+     *
+     * @param context
+     * @param uri 图片
+     * @param scene 识别场景类型
+     */
+    public void startOcrFromUri(Context context, Uri uri, String scene) {
+        if (getView() != null) {
+            getView().onOcrResult();
+        }
+    }
+}

+ 1 - 1
app/src/main/java/com/miekir/ocr/view/AutoFitTextureView.java

@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.miekir.ocr.view;
+package com.miekir.ocr.widget;
 
 import android.content.Context;
 import android.util.AttributeSet;

+ 5 - 4
app/src/main/java/com/miekir/ocr/view/CropView.java

@@ -1,4 +1,4 @@
-package com.miekir.ocr.view;
+package com.miekir.ocr.widget;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -21,8 +21,9 @@ import com.miekir.ocr.R;
 public class CropView extends View {
     public static final int SCAN_TYPE_POSTAL = 0;
     public static final int SCAN_TYPE_ADDRESS = 1;
-    public static final int SCAN_TYPE_NAME = 1;
-    public static final int SCAN_TYPE_ALL = 2;
+    public static final int SCAN_TYPE_NAME = 2;
+    public static final int SCAN_TYPE_ALL = 3;
+    public static final String[] SCAN_SCENES = {"postcode", "address", "name", "all"};
     public static final int[] SCAN_TYPES = {SCAN_TYPE_POSTAL, SCAN_TYPE_ADDRESS, SCAN_TYPE_NAME, SCAN_TYPE_ALL};
     private static final String TAG = "PhotoCropView";
 
@@ -94,7 +95,7 @@ public class CropView extends View {
                 sX = (getWidth()-coverWidth)/2;
                 sY = (int) (getWidth()*0.177);
                 break;
-            //case SCAN_TYPE_ADDRESS:
+            case SCAN_TYPE_ADDRESS:
             case SCAN_TYPE_NAME:
                 coverWidth = (int) (getWidth()*0.815);
                 coverHeight = (int) (getWidth()*0.625);

+ 1 - 1
app/src/main/java/com/miekir/ocr/view/GlideV4ImageEngine.java

@@ -1,4 +1,4 @@
-package com.miekir.ocr.view;
+package com.miekir.ocr.widget;
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;

+ 1 - 1
app/src/main/java/com/miekir/ocr/view/IndicatorText.java

@@ -1,4 +1,4 @@
-package com.miekir.ocr.view;
+package com.miekir.ocr.widget;
 
 import android.content.Context;
 import android.content.res.TypedArray;

+ 1 - 1
app/src/main/java/com/miekir/ocr/view/crop/CropLayout.java

@@ -1,4 +1,4 @@
-package com.miekir.ocr.view.crop;
+package com.miekir.ocr.widget.crop;
 
 import android.annotation.SuppressLint;
 import android.content.Context;

+ 1 - 1
app/src/main/java/com/miekir/ocr/view/crop/CustomDrawable.java

@@ -1,4 +1,4 @@
-package com.miekir.ocr.view.crop;
+package com.miekir.ocr.widget.crop;
 
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;

+ 6 - 6
app/src/main/res/layout/activity_camera.xml

@@ -37,7 +37,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
-        <com.miekir.ocr.view.AutoFitTextureView
+        <com.miekir.ocr.widget.AutoFitTextureView
             android:id="@+id/textureView"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
@@ -49,7 +49,7 @@
 
 
              <!--灰色遮罩-->
-             <com.miekir.ocr.view.CropView
+             <com.miekir.ocr.widget.CropView
                  android:id="@+id/pcv_scan"
                  android:layout_width="match_parent"
                  android:layout_height="0dp"
@@ -76,7 +76,7 @@
                         android:layout_height="wrap_content"
                         android:layout_weight="1" />
 
-                    <com.miekir.ocr.view.IndicatorText
+                    <com.miekir.ocr.widget.IndicatorText
                         android:id="@+id/it_postal"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
@@ -87,7 +87,7 @@
                         android:layout_height="wrap_content"
                         android:layout_weight="1" />
 
-                    <com.miekir.ocr.view.IndicatorText
+                    <com.miekir.ocr.widget.IndicatorText
                         android:id="@+id/it_address"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
@@ -98,7 +98,7 @@
                         android:layout_height="wrap_content"
                         android:layout_weight="1" />
 
-                    <com.miekir.ocr.view.IndicatorText
+                    <com.miekir.ocr.widget.IndicatorText
                         android:id="@+id/it_name"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
@@ -109,7 +109,7 @@
                         android:layout_height="wrap_content"
                         android:layout_weight="1" />
 
-                    <com.miekir.ocr.view.IndicatorText
+                    <com.miekir.ocr.widget.IndicatorText
                         android:id="@+id/it_all"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"

+ 2 - 2
app/src/main/res/layout/view_crop.xml

@@ -4,7 +4,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
     <!--灰色遮罩-->
-    <com.miekir.ocr.view.crop.CropLayout
+    <com.miekir.ocr.widget.crop.CropLayout
         android:id="@+id/layout"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -16,5 +16,5 @@
             android:layout_width="200dp"
             android:layout_height="200dp" />
 
-    </com.miekir.ocr.view.crop.CropLayout>
+    </com.miekir.ocr.widget.crop.CropLayout>
 </LinearLayout>

+ 15 - 0
app/src/main/res/values-ja-rJP/strings.xml

@@ -0,0 +1,15 @@
+<resources>
+    <string name="app_name">NRI AIOCR</string>
+    <string name="copy">コピー</string>
+    <string name="cancel">戻る</string>
+    <string name="done">完了</string>
+    <string name="loading">少々お待ちください...</string>
+    <string name="postal_code">郵便番号</string>
+    <string name="address">住所</string>
+    <string name="name">名前</string>
+    <string name="full">全範囲</string>
+    <string name="result"># 識別結果</string>
+    <string name="copy_success">コピー成功</string>
+    <string name="permission_msg">カメラまたはストレージのアクセス許可が拒否されました</string>
+    <string name="confirm">確認</string>
+</resources>

app/src/main/res/values-zh_CN/strings.xml → app/src/main/res/values-zh-rCN/strings.xml


+ 1 - 1
network/src/main/java/com/miekir/network/constant/RequestConst.java

@@ -13,5 +13,5 @@ public interface RequestConst {
      * todo 改成项目真正的请求域名,或者在调用网络请求之后手动调用以下代码设置请求的Host
      * RetrofitHelper.getInstance().setRequestHost()
      */
-    String BASE_URL = "http://www.baidu.com";
+    String BASE_URL = "http://8.210.64.236:8094";
 }

+ 1 - 1
network/src/main/java/com/miekir/network/core/base/BaseObserver.java

@@ -22,7 +22,7 @@ public abstract class BaseObserver<T> implements Observer<BaseResponse<T>> {
             } else if (response.getCode() == Code.TOKEN_TIMEOUT) {
                 // todo 重新登录
             } else {
-                onFailure(new Exception(response.getMsg()), response.getMsg());
+                onFailure(new Exception(response.getMessage()), response.getMessage());
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 14 - 5
network/src/main/java/com/miekir/network/core/base/BaseResponse.java

@@ -7,7 +7,8 @@ package com.miekir.network.core.base;
 
 public class BaseResponse<T> {
     private int code;
-    private String msg;
+    private String message;
+    private String request_id;
     private T content;
 
     /**
@@ -37,11 +38,19 @@ public class BaseResponse<T> {
      *
      * @return 返回信息
      */
-    public String getMsg() {
-        return msg;
+    public String getMessage() {
+        return message;
     }
 
-    public void setMsg(String msg) {
-        this.msg = msg;
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getRequest_id() {
+        return request_id;
+    }
+
+    public void setRequest_id(String request_id) {
+        this.request_id = request_id;
     }
 }