ソースを参照

发送请求之前

詹子聪 5 年 前
コミット
c36a2d0ab9

+ 2 - 1
app/src/main/java/com/miekir/ocr/api/ApiService.java

@@ -1,6 +1,7 @@
 package com.miekir.ocr.api;
 
 import com.miekir.network.core.base.BaseResponse;
+import com.miekir.ocr.bean.OcrResult;
 
 import java.util.Map;
 
@@ -19,5 +20,5 @@ public interface ApiService {
      * 获取识别结果
      */
     @POST("/api/jphandwritingocr/jpExpressHwOcr")
-    Observable<BaseResponse<Object>> getOcrResult(@Body Map<String, Object> body);
+    Observable<BaseResponse<OcrResult>> getOcrResult(@Body Map<String, Object> body);
 }

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

@@ -7,7 +7,7 @@ package com.miekir.ocr.bean;
  * Description: 识别结果
  */
 public class OcrResult {
-    private CommonBean address;
-    private CommonBean name;
-    private CommonBean postcode;
+    public CommonBean address;
+    public CommonBean name;
+    public CommonBean postcode;
 }

+ 11 - 0
app/src/main/java/com/miekir/ocr/constant/ConstantString.java

@@ -0,0 +1,11 @@
+package com.miekir.ocr.constant;
+
+/**
+ *
+ * @author 詹子聪
+ * @date 2020/7/27 21:30
+ * Description: 常量
+ */
+public interface ConstantString {
+    String REFULT_FORMAT = "%s:$%s";
+}

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

@@ -12,7 +12,7 @@ import java.util.Locale;
  */
 public class DateTool {
     private DateTool(){}
-    private static final String FORMAT_REQUEST = "YYYYMMDDHHmmssfff";
+    private static final String FORMAT_REQUEST = "YYYYMMddHHmmssSSS";
     private static SimpleDateFormat mFormat = new SimpleDateFormat(FORMAT_REQUEST, Locale.getDefault());
 
     public static String getRequestId() {

+ 83 - 0
app/src/main/java/com/miekir/ocr/tool/SystemTool.java

@@ -0,0 +1,83 @@
+package com.miekir.ocr.tool;
+
+import android.app.Activity;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+
+import com.miekir.common.utils.ToastTool;
+
+
+/**
+ * Created by Jason on 2018/9/11.
+ */
+
+public class SystemTool {
+    private SystemTool() {}
+    private static final String LABEL_COPY = "nri_aiocr";
+    public static boolean copyText(Context context, String text) {
+        ClipboardManager manager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
+        ClipData clipData = ClipData.newPlainText(LABEL_COPY, text);
+        if (manager != null) {
+            manager.setPrimaryClip(clipData);
+            return true;
+        }
+        return false;
+    }
+
+    public static int getVersionCode(Context context) {
+        int versionCode = -1;
+        PackageManager packageManager = context.getPackageManager();
+        try {
+            if (packageManager != null) {
+                PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
+                return packageInfo.versionCode;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return versionCode;
+    }
+
+    public static String getVersionName(Context context) {
+        PackageManager manager = context.getPackageManager();
+        if (manager != null) {
+            try {
+                //获取软件版本号,对应AndroidManifest.xml下android:versionCode,0表示基本信息
+                return manager.getPackageInfo(context.getPackageName(), 0).versionName;
+            } catch (PackageManager.NameNotFoundException e) {
+                e.printStackTrace();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 发送邮件
+     * @param activity
+     */
+    public static void sendEmail(Activity activity) {
+        if (activity == null) {
+            return;
+        }
+
+        boolean copyResult = SystemTool.copyText(activity, "[email protected]");
+        if (!copyResult) {
+            ToastTool.showLong("请发送到[email protected]");
+        } else {
+            ToastTool.showShort("已复制反馈邮箱号");
+        }
+        Intent emailIntent = new Intent(Intent.ACTION_SEND);
+        emailIntent.setType("application/octet-stream");
+        try {
+            activity.startActivity(emailIntent);
+        } catch (Exception e) {
+            e.printStackTrace();
+            ToastTool.showShort("未找到邮箱客户端");
+        }
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.miekir.ocr.ui;
 
 import com.miekir.mvp.view.IView;
+import com.miekir.ocr.bean.OcrResult;
 
 /**
  *
@@ -9,5 +10,5 @@ import com.miekir.mvp.view.IView;
  * Description: 事务回调
  */
 public interface IOperationView extends IView {
-    void onOcrResult();
+    void onOcrResult(OcrResult result);
 }

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

@@ -1,16 +1,22 @@
 package com.miekir.ocr.ui;
 
+import android.app.AlertDialog;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.net.Uri;
 import android.os.Bundle;
 import android.view.View;
+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.constant.ConstantString;
+import com.miekir.ocr.tool.SystemTool;
 import com.miekir.ocr.widget.CropView;
 import com.miekir.ocr.widget.GlideV4ImageEngine;
 import com.miekir.ocr.widget.IndicatorText;
@@ -114,7 +120,78 @@ public class OperationActivity extends CameraActivity implements CropView.onLoca
     }
 
     @Override
-    public void onOcrResult() {
+    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.findViewById(R.id.tv_copy).setOnClickListener(v -> {
+            dialog.cancel();
+            if (result == null) {
+                return;
+            }
+
+            SystemTool.copyText(OperationActivity.this, "");
+            // todo 复制全部识别信息
+            if (mCurrentType == CropView.SCAN_TYPE_ALL) {
+
+            } else if (mCurrentType == CropView.SCAN_TYPE_POSTAL) {
+                if (result.postcode != null) {
+                    SystemTool.copyText(OperationActivity.this, result.postcode.getText());
+                }
+            } else if (mCurrentType == CropView.SCAN_TYPE_ADDRESS) {
+                if (result.address != null) {
+                    SystemTool.copyText(OperationActivity.this, result.address.getText());
+                }
+            } else if (mCurrentType == CropView.SCAN_TYPE_NAME) {
+                if (result.name != null) {
+                    SystemTool.copyText(OperationActivity.this, result.name.getText());
+                }
+            }
+
+            ToastTool.showShort(getString(R.string.copy_success));
+        });
+        dialog.findViewById(R.id.tv_cancel).setOnClickListener(v -> {
+            dialog.cancel();
+        });
+
+        if (result == null) {
+            return;
+        }
+
+        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);
+        if (mCurrentType == CropView.SCAN_TYPE_ALL) {
+            tv_postal.setVisibility(View.VISIBLE);
+            tv_address.setVisibility(View.VISIBLE);
+            tv_name.setVisibility(View.VISIBLE);
+        } else if (mCurrentType == CropView.SCAN_TYPE_POSTAL) {
+            tv_postal.setVisibility(View.VISIBLE);
+        } else if (mCurrentType == CropView.SCAN_TYPE_ADDRESS) {
+            tv_address.setVisibility(View.VISIBLE);
+        } else if (mCurrentType == CropView.SCAN_TYPE_NAME) {
+            tv_name.setVisibility(View.VISIBLE);
+        }
+
+        if (result.postcode != null) {
+            tv_postal.setText(String.format(ConstantString.REFULT_FORMAT, getString(R.string.postal_code), result.postcode.getText()));
+        }
+
+        if (result.address != null) {
+            tv_address.setText(String.format(ConstantString.REFULT_FORMAT, getString(R.string.address), result.address.getText()));
+        }
+
+        if (result.name != null) {
+            tv_name.setText(String.format(ConstantString.REFULT_FORMAT, getString(R.string.name), result.name.getText()));
+        }
     }
 }

+ 66 - 3
app/src/main/java/com/miekir/ocr/ui/OperationPresenter.java

@@ -2,8 +2,25 @@ package com.miekir.ocr.ui;
 
 import android.content.Context;
 import android.net.Uri;
+import android.text.TextUtils;
 
 import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.network.core.RetrofitHelper;
+import com.miekir.network.core.base.BaseObserver;
+import com.miekir.ocr.R;
+import com.miekir.ocr.api.ApiService;
+import com.miekir.ocr.bean.OcrResult;
+import com.miekir.ocr.tool.Base64Tool;
+import com.miekir.ocr.tool.DateTool;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
 
 /**
  *
@@ -20,8 +37,54 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
      * @param scene 识别场景类型
      */
     public void startOcrFromUri(Context context, Uri uri, String scene) {
-        if (getView() != null) {
-            getView().onOcrResult();
-        }
+        getView().showLoading(context.getResources().getString(R.string.loading));
+        Observable.create(new ObservableOnSubscribe<String>() {
+            @Override
+            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
+                // 根据URI获取图片的base64字符串
+                String photoBase64 = Base64Tool.getBase64FromUri(context, uri);
+                if (TextUtils.isEmpty(photoBase64)) {
+                    emitter.onError(new Exception("Empty image"));
+                } else {
+                    emitter.onNext(photoBase64);
+                }
+        }})
+            /*.filter(base64String -> {
+                // 图片base64不为空才继续,否则直接忽略,没有任何回调会被调用
+                return !TextUtils.isEmpty(base64String);
+            })*/
+            .flatMap(photoBase64 -> {
+                Map<String, Object> requestParams = new HashMap<>();
+                requestParams.put("request_id", "035992000119071904311742_"+ DateTool.getRequestId());
+                requestParams.put("appid", "10233937");
+                requestParams.put("image", photoBase64);
+                Map<String, Object> options = new HashMap<>();
+                options.put("options.scene", scene);
+                requestParams.put("options", options);
+
+                // 发送识别请求
+                return RetrofitHelper.getInstance()
+                        .getRequestApi(ApiService.class)
+                        .getOcrResult(requestParams);
+            })
+            .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+            .subscribe(new BaseObserver<OcrResult>() {
+                @Override
+                public void onSuccess(OcrResult result) {
+                    if (getView() != null) {
+                        getView().dismissLoading();
+                        getView().onOcrResult(result);
+                    }
+                }
+
+                @Override
+                public void onFailure(Throwable e, String errMsg) {
+                    // 装饰器模式
+                    if (getView() != null) {
+                        getView().dismissLoading();
+                        getView().onOcrResult(null);
+                    }
+                }
+            });
     }
 }

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

@@ -187,6 +187,9 @@ public class CropView extends View {
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
+        if (mPaint == null) {
+            return;
+        }
         mPaint.setFilterBitmap(false);
         int sc = canvas.saveLayer(0, 0, canvas.getWidth(), canvas.getHeight(), null,
                 Canvas.ALL_SAVE_FLAG);

+ 22 - 0
app/src/main/res/drawable/selector_cancel.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="true">
+        <shape
+            android:shape="rectangle">
+            <solid android:color="@color/divider" />
+            <corners android:radius="@dimen/margin_dialog" />
+            <stroke android:width="1dp" android:color="@color/gray_stroke"/>
+        </shape>
+    </item>
+
+    <item>
+        <shape
+            android:shape="rectangle">
+            <solid android:color="@color/white" />
+            <corners android:radius="@dimen/margin_dialog" />
+            <stroke android:width="1dp" android:color="@color/gray_stroke"/>
+        </shape>
+    </item>
+</selector>
+

+ 20 - 0
app/src/main/res/drawable/selector_copy.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="true">
+        <shape
+            android:shape="rectangle">
+            <solid android:color="@color/blue_copy" />
+            <corners android:radius="@dimen/margin_dialog" />
+        </shape>
+    </item>
+
+    <item>
+        <shape
+            android:shape="rectangle">
+            <solid android:color="@color/colorPrimary" />
+            <corners android:radius="@dimen/margin_dialog" />
+        </shape>
+    </item>
+</selector>
+

+ 6 - 0
app/src/main/res/drawable/shape_result_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <corners android:radius="@dimen/margin_default" />
+</shape>

+ 98 - 0
app/src/main/res/layout/dialog_result.xml

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@drawable/shape_result_bg">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="56dp"
+        android:gravity="center_vertical"
+        android:textColor="@color/black_press"
+        android:textSize="@dimen/size_text_title"
+        android:text="@string/result"
+        android:paddingStart="@dimen/margin_default"
+        android:paddingEnd="@dimen/margin_default"/>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="2dp"
+        android:background="@color/divider"/>
+    <TextView
+        android:id="@+id/tv_postal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="@dimen/margin_default"
+        android:paddingEnd="@dimen/margin_default"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:textColor="@color/black_press"
+        android:layout_marginTop="@dimen/margin_dialog"
+        android:visibility="invisible"/>
+
+    <TextView
+        android:id="@+id/tv_address"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="@dimen/margin_default"
+        android:paddingEnd="@dimen/margin_default"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:textColor="@color/black_press"
+        android:layout_marginTop="@dimen/margin_dialog"
+        android:visibility="invisible"/>
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="@dimen/margin_default"
+        android:paddingEnd="@dimen/margin_default"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:textColor="@color/black_press"
+        android:layout_marginTop="@dimen/margin_dialog"
+        android:visibility="invisible"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:gravity="center"
+        android:paddingStart="@dimen/margin_default"
+        android:paddingEnd="@dimen/margin_default"
+        android:layout_marginTop="64dp"
+        android:layout_marginBottom="32dp">
+
+        <TextView
+            android:id="@+id/tv_copy"
+            android:layout_width="114dp"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:gravity="center"
+            android:textColor="@color/white"
+            android:paddingTop="@dimen/margin_default"
+            android:paddingBottom="@dimen/margin_default"
+            android:background="@drawable/selector_copy"
+            android:text="@string/copy"/>
+
+        <Space
+            android:layout_width="@dimen/margin_default"
+            android:layout_height="wrap_content"/>
+
+        <TextView
+            android:id="@+id/tv_cancel"
+            android:layout_width="114dp"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:textColor="@color/black_press"
+            android:gravity="center"
+            android:paddingTop="@dimen/margin_default"
+            android:paddingBottom="@dimen/margin_default"
+            android:background="@drawable/selector_cancel"
+            android:text="@string/cancel"/>
+    </LinearLayout>
+</LinearLayout>

+ 3 - 1
app/src/main/res/values/colors.xml

@@ -6,5 +6,7 @@
     <color name="white">#FFFFFF</color>
     <color name="black_transparent">#77000000</color>
     <color name="black_press">#E6000000</color>
-
+    <color name="divider">#E5E5E5</color>
+    <color name="blue_copy">#33A4E2</color>
+    <color name="gray_stroke">#C1C1C1</color>
 </resources>

+ 1 - 0
app/src/main/res/values/dimens.xml

@@ -1,6 +1,7 @@
 <resources>
     <!-- Default screen margins, per the Android Design guidelines. -->
     <dimen name="margin_default">16dp</dimen>
+    <dimen name="margin_dialog">32dp</dimen>
     <dimen name="margin_ss">4dp</dimen>
     <dimen name="margin_s">8dp</dimen>
     <dimen name="width_focus">7dp</dimen>

+ 1 - 3
mvp/src/main/java/com/miekir/mvp/widget/LoadingDialog.java

@@ -15,7 +15,6 @@ public class LoadingDialog {
     private TextView loadingText;
     Dialog mLoadingDialog;
     Context mContext;
-    private String msg = "加载中...";
 
     public LoadingDialog(Context context) {
         mContext = context;
@@ -28,12 +27,11 @@ public class LoadingDialog {
         mLoadingView = (LVCircularRing) view.findViewById(R.id.lv_circularring);
         // 页面中显示文本
         loadingText = (TextView) view.findViewById(R.id.loading_text);
-        // 显示文本
-        loadingText.setText(msg);
         // 创建自定义样式的Dialog
         mLoadingDialog = new Dialog(context, R.style.loading_dialog);
         // 设置返回键无效
         mLoadingDialog.setCancelable(false);
+        mLoadingDialog.setCanceledOnTouchOutside(false);
         mLoadingDialog.setContentView(dialogLayout, new LinearLayout.LayoutParams(
                 LinearLayout.LayoutParams.MATCH_PARENT,
                 LinearLayout.LayoutParams.MATCH_PARENT));

+ 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://8.210.64.236:8094";
+    String BASE_URL = "http://www.jianjieshenghuo.com";
 }

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

@@ -26,6 +26,7 @@ public abstract class BaseObserver<T> implements Observer<BaseResponse<T>> {
             }
         } catch (Exception e) {
             e.printStackTrace();
+            onFailure(new Exception("null"), "null");
         }
     }