@@ -263,6 +263,9 @@ dependencies { | |||
//https://github.com/RuffianZhong/RWidgetHelper | |||
implementation 'com.github.RuffianZhong:RWidgetHelper:androidx.v0.0.13' | |||
//身份证虚影校验 OpenCV 库进行图像处理 | |||
implementation 'org.opencv:opencv-android:4.5.4' | |||
// //注释掉原有bugly的仓库 | |||
// //compile 'com.tencent.bugly:crashreport:latest.release'//其中latest.release指代最新版本号,也可以指定明确的版本号,例如2.3.2 | |||
// implementation 'com.tencent.bugly:crashreport_upgrade:1.2.0'//其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.0 |
@@ -306,10 +306,15 @@ | |||
android:name=".project.ui.activity.after.TopUpActivity" | |||
android:launchMode="singleTop" | |||
android:screenOrientation="portrait" /> | |||
<activity android:name=".project.ui.activity.after.TopDefrayActivity" | |||
<activity | |||
android:name=".project.ui.activity.after.TopDefrayActivity" | |||
android:launchMode="singleTop" | |||
android:screenOrientation="portrait"/> | |||
<activity android:name=".project.ui.activity.after.TopEntrapmentActivity" | |||
android:screenOrientation="portrait" /> | |||
<activity | |||
android:name=".project.ui.activity.after.TopEntrapmentActivity" | |||
android:launchMode="singleTop" | |||
android:screenOrientation="portrait" /> | |||
<activity android:name=".project.ui.activity.TestActivity" | |||
android:launchMode="singleTop" | |||
android:screenOrientation="portrait"/> | |||
</application> |
@@ -66,13 +66,6 @@ public class ContractActivity extends AppActivity { | |||
@Override | |||
@SingleClick | |||
public void onClick(View view) { | |||
LiveEventBus.get("homeOneUpdateData").post(""); | |||
Bundle bundle = new Bundle(); | |||
bundle.putString("bizContent", getIntent().getStringExtra("bizContent")); | |||
bundle.putString("orderId", getIntent().getStringExtra("orderId")); | |||
jumpToPage(ETCHandleSonActivity.class,bundle); | |||
finish(); | |||
/*Intent intent = new Intent(); | |||
intent.putExtra("orderId", getIntent().getStringExtra("orderId")); | |||
intent.putExtra("bizContent", getIntent().getStringExtra("bizContent")); | |||
@@ -81,7 +74,7 @@ public class ContractActivity extends AppActivity { | |||
finish();*/ | |||
//签约检测 | |||
/* FatherBean<SendTheVerificationCodeBean> fatherBean = new FatherBean<>(); | |||
FatherBean<SendTheVerificationCodeBean> fatherBean = new FatherBean<>(); | |||
fatherBean.bizContent = new SendTheVerificationCodeBean(); | |||
fatherBean.bizContent.setOrderId(getIntent().getStringExtra("orderId")); | |||
Log.e("okhttp", "打印标题:" + new Gson().toJson(fatherBean)); | |||
@@ -90,12 +83,18 @@ public class ContractActivity extends AppActivity { | |||
public void onSuccess(ResultBean resultBean, ResultBean.BizContent bizContent1) { | |||
binding.nextStep.setEnabled(true); | |||
if ("NORMAL".equals(bizContent1.getUserState())) { | |||
LiveEventBus.get("homeUpdateData").post("更新首页信息内容"); | |||
LiveEventBus.get("homeOneUpdateData").post("更新首页列表信息内容"); | |||
Intent intent = new Intent(); | |||
intent.putExtra("orderId", getIntent().getStringExtra("orderId")); | |||
intent.setClass(ContractActivity.this, ETCHandleActivity.class); | |||
startActivity(intent); | |||
// LiveEventBus.get("homeUpdateData").post("更新首页信息内容"); | |||
// LiveEventBus.get("homeOneUpdateData").post("更新首页列表信息内容"); | |||
// Intent intent = new Intent(); | |||
// intent.putExtra("orderId", getIntent().getStringExtra("orderId")); | |||
// intent.setClass(ContractActivity.this, ETCHandleActivity.class); | |||
// startActivity(intent); | |||
// finish(); | |||
LiveEventBus.get("homeOneUpdateData").post(""); | |||
Bundle bundle = new Bundle(); | |||
bundle.putString("bizContent", getIntent().getStringExtra("bizContent")); | |||
bundle.putString("orderId", getIntent().getStringExtra("orderId")); | |||
jumpToPage(ETCHandleSonActivity.class,bundle); | |||
finish(); | |||
} else if ("OVERDUE".equals(bizContent1.getUserState())) { | |||
showDilog("用户已开通车主服务,但存在欠费,请用户于微信车主服务补缴费用后再次办理。"); | |||
@@ -112,7 +111,7 @@ public class ContractActivity extends AppActivity { | |||
binding.nextStep.setEnabled(true); | |||
} | |||
}); | |||
binding.nextStep.setEnabled(false);*/ | |||
binding.nextStep.setEnabled(false); | |||
} | |||
public void showDilog(String msg) { |
@@ -0,0 +1,163 @@ | |||
package com.huntersun.vkyes.etcopencard.project.ui.activity; | |||
import androidx.appcompat.app.AppCompatActivity; | |||
import android.graphics.Bitmap; | |||
import android.graphics.BitmapFactory; | |||
import android.hardware.Camera; | |||
import android.os.Bundle; | |||
import android.view.SurfaceHolder; | |||
import android.view.SurfaceView; | |||
import android.view.View; | |||
import com.huntersun.vkyes.etcopencard.R; | |||
import com.huntersun.vkyes.etcopencard.databinding.ActivitySubscribeListBinding; | |||
import com.huntersun.vkyes.etcopencard.databinding.ActivityTestBinding; | |||
import com.huntersun.vkyes.etcopencard.src.app.AppActivity; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
import org.opencv.android.BaseLoaderCallback; | |||
import org.opencv.android.LoaderCallbackInterface; | |||
import org.opencv.android.OpenCVLoader; | |||
import org.opencv.android.Utils; | |||
import org.opencv.core.Core; | |||
import org.opencv.core.Mat; | |||
import org.opencv.core.MatOfPoint; | |||
import org.opencv.core.Rect; | |||
import org.opencv.imgproc.Imgproc; | |||
/** | |||
* @author admin | |||
*/ | |||
public class TestActivity extends AppActivity { | |||
private ActivityTestBinding binding; | |||
private static final String TAG = "TestActivity"; | |||
static { | |||
System.loadLibrary("opencv_java3"); | |||
} | |||
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { | |||
@Override | |||
public void onManagerConnected(int status) { | |||
switch (status) { | |||
case LoaderCallbackInterface.SUCCESS: | |||
// OpenCV加载成功 | |||
break; | |||
default: | |||
super.onManagerConnected(status); | |||
break; | |||
} | |||
} | |||
}; | |||
@Override | |||
protected void onCreate(Bundle savedInstanceState) { | |||
super.onCreate(savedInstanceState); | |||
// 引入 OpenCV 库 | |||
if (!OpenCVLoader.initDebug()) { | |||
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); | |||
} else { | |||
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); | |||
} | |||
} | |||
@Override | |||
protected View getLayoutView() { | |||
binding = ActivityTestBinding.inflate(getLayoutInflater()); | |||
return binding.getRoot(); | |||
} | |||
@Override | |||
protected void initView() { | |||
// 设置相机参数 | |||
Camera camera = Camera.open(); | |||
Camera.Parameters parameters = camera.getParameters(); | |||
parameters.setPreviewSize(200, 200); | |||
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); | |||
camera.setParameters(parameters); | |||
// 显示相机预览 | |||
SurfaceView surfaceView = findViewById(R.id.surfaceView); | |||
SurfaceHolder holder = surfaceView.getHolder(); | |||
try { | |||
camera.setPreviewDisplay(holder); | |||
} catch (IOException e) { | |||
e.printStackTrace(); | |||
} | |||
camera.startPreview(); | |||
// 拍摄照片 | |||
camera.takePicture(null, null, new Camera.PictureCallback() { | |||
@Override | |||
public void onPictureTaken(byte[] data, Camera camera) { | |||
// 获取照片数据 | |||
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); | |||
// 对照片进行虚影校验 | |||
boolean isCard = checkIdCard(bitmap); | |||
if (isCard) { | |||
// 裁剪照片 | |||
Bitmap cardBitmap = cropIdCard(bitmap); | |||
// 保存照片到本地或上传到服务器 | |||
saveCardBitmap(cardBitmap); | |||
} | |||
} | |||
}); | |||
} | |||
// 身份证虚影校验算法 | |||
private boolean checkIdCard(Bitmap bitmap) { | |||
// 将照片转换为灰度图像 | |||
Mat mat = new Mat(); | |||
Utils.bitmapToMat(bitmap, mat); | |||
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY); | |||
// 计算二值化阈值 | |||
Mat binary = new Mat(); | |||
Imgproc.threshold(mat, binary, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); | |||
// 消除噪点 | |||
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3)); | |||
Imgproc.erode(binary, binary, kernel); | |||
Imgproc.dilate(binary, binary, kernel); | |||
// 检测轮廓 | |||
List<MatOfPoint> contours = new ArrayList<>(); | |||
Mat hierarchy = new Mat(); | |||
Imgproc.findContours(binary, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); | |||
// 进行轮廓匹配 | |||
for (MatOfPoint contour : contours) { | |||
double matchScore = Imgproc.matchShapes(contour, ID_CARD_CONTOUR, Imgproc.CONTOURS_MATCH_I1, 0); | |||
if (matchScore < MAX_MATCH_SCORE) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
// 身份证裁剪算法 | |||
private Bitmap cropIdCard(Bitmap bitmap) { | |||
// 实现身份证裁剪算法 | |||
} | |||
// 保存照片到本地或上传到服务器 | |||
private void saveCardBitmap(Bitmap bitmap) { | |||
// 实现保存照片到本地或上传到服务器 | |||
} | |||
@Override | |||
protected void initData() { | |||
} | |||
} |
@@ -0,0 +1,14 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<FrameLayout 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:layout_width="match_parent" | |||
android:layout_height="match_parent" | |||
tools:context=".project.ui.activity.TestActivity"> | |||
<SurfaceView | |||
android:id="@+id/surfaceView" | |||
android:layout_width="match_parent" | |||
android:layout_height="match_parent" /> | |||
</FrameLayout> |