diff --git a/README.md b/README.md
index d8811af..04ad850 100644
--- a/README.md
+++ b/README.md
@@ -3,14 +3,23 @@
1.极速识别二代身份证(无需联网,离线秒扫,极速识别)身份证所有信息, 包含 姓名、性别、出生年月、详细地址,正反面。可识别新疆少数民族身份证,可保存识别图片。
2.极速识别驾驶证(无需联网,离线秒扫,极速识别)国家,初始领证,准驾车型,有效期限,可保存识别图片。
3.极速识别银行卡(无需联网,离线秒扫,极速识别)卡号,过期日期,发卡银行,卡名,机构代码,卡种,可保存识别图片。
-4.没有任何限制(如不要求验签,不限制次数,任由您使用)
```
+### 注意事项
+```Xml
+1.API没有任何限制(如:不要求验签,不限制次数,永久免费,任由您使用)
+2.demo中已基本涵盖了所有核心API的使用,代码写的很烂,但您一定看得懂
+3.请尽量扫描真实事物,扫描电脑屏幕成功率低且速度慢
+4.如发现与其他本地库编译有冲突,请将arr文件中的“armeabi”文件夹改名为"armeabi-v7a",同时删除其他本地库中除了"armeabi-v7a"以外的所有abi文件夹,最后将build.gradle中的abiFilters改为仅有“armeabi-v7a”即可解决冲突
+```
+### 1.2版-更新日志
+```Xml
+【2020-5-13 10:14】
+1.废弃车牌识别功能,官方已作出限制,原来的官方demo的key已无法正常使用
+2.建议车牌识别使用https://github.com/zeusees/HyperLPR这个库
-# 鸣谢 XieZhiFa大神
+### 鸣谢 XieZhiFa大神
```Xml
-(https://github.com/XieZhiFa/IdCardOCR),识别身份证及驾驶证代码提取自该大神的开源项目
-1.本项目在XieZhiFa大神的项目上扩增了离线识别银行卡功能,包体积没有太大变化
-2.本demo中已基本涵盖了所有核心API的使用,代码写的很烂,但您一定看得懂
+(https://github.com/XieZhiFa/IdCardOCR),识别身份证及驾驶证代码提取自该大神的开源项目,已绿化,无需验签。
```
### aar集成方式
@@ -24,11 +33,19 @@
dirs 'libs'
}
}
+ defaultConfig {
+ ndk {
+ abiFilters "armeabi"
+ }
+ }
}
dependencies {
- implementation (name: 'ocr-library', ext: 'aar')
+ implementation (name: 'ocr-library-1.2', ext: 'aar')
}
```
+```Xml
+Manifest.xml中给存储读写权限、摄像头权限、internet访问权限
+```
### 识别身份证及驾驶证核心api(LibraryInitOCR.class)
```Java
//1. Application中初始化
@@ -142,10 +159,9 @@
*/
public native void WTUnInitCardKernal();
```
-
### 混淆
```Xml
-以自动处理混淆,无需处理
+已自动处理混淆,无需处理
```
#### 联系我
```Xml
diff --git a/app/build.gradle b/app/build.gradle
index 4372ad6..8830659 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,6 +9,9 @@ android {
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ ndk {
+ abiFilters "armeabi"
+ }
}
buildTypes {
release {
@@ -30,6 +33,6 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
- implementation (name: 'ocr-library', ext: 'aar')
+ implementation (name: 'ocr-library-1.2', ext: 'aar')
implementation 'com.yanzhenjie:permission:2.0.0-rc12'
}
diff --git a/app/libs/ocr-library-1.2.aar b/app/libs/ocr-library-1.2.aar
new file mode 100644
index 0000000..ffb734a
Binary files /dev/null and b/app/libs/ocr-library-1.2.aar differ
diff --git a/app/libs/ocr-library.aar b/app/libs/ocr-library.aar
deleted file mode 100644
index 7ce1b98..0000000
Binary files a/app/libs/ocr-library.aar and /dev/null differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1a822c5..0941cc5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/java/com/fanjun/orclibs/MainActivity.java b/app/src/main/java/com/fanjun/orclibs/MainActivity.java
index 7403457..88bbbcd 100644
--- a/app/src/main/java/com/fanjun/orclibs/MainActivity.java
+++ b/app/src/main/java/com/fanjun/orclibs/MainActivity.java
@@ -15,11 +15,12 @@
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- Button mScanIdCard, mScanDriverCard, mScanBankCard;
+ Button mScanIdCard, mScanDriverCard, mScanBankCard, mScanCarCard;
TextView mSuccessText;
public static final int SCAN_IDCARD_REQUEST = 1;
public static final int SCAN_DRIVERCARD_REQUEST = 2;
public static final int SCAN_BANKCARD_REQUEST = 3;
+ public static final int SCAN_CAR_REQUEST = 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -29,9 +30,11 @@ protected void onCreate(Bundle savedInstanceState) {
mScanDriverCard = findViewById(R.id.mScanDriverCard);
mScanBankCard = findViewById(R.id.mScanBankCard);
mSuccessText = findViewById(R.id.mSuccessText);
+ mScanCarCard = findViewById(R.id.mScanCarCard);
mScanIdCard.setOnClickListener(this);
mScanDriverCard.setOnClickListener(this);
mScanBankCard.setOnClickListener(this);
+ mScanCarCard.setOnClickListener(this);
AndPermission.with(this).runtime().permission(Permission.Group.CAMERA, Permission.Group.STORAGE).start();
}
@@ -62,6 +65,10 @@ public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ScanBankCardActivity.class);
startActivityForResult(intent, SCAN_BANKCARD_REQUEST);
break;
+ //识别车牌号
+ case R.id.mScanCarCard:
+ Intent intent2 = new Intent(MainActivity.this, ScanCarActivity.class);
+ startActivityForResult(intent2, SCAN_CAR_REQUEST);
}
}
@@ -107,8 +114,11 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
break;
case SCAN_BANKCARD_REQUEST:
- String result2 = data.getStringExtra("OCRResult");
- mSuccessText.setText(result2);
+ mSuccessText.setText(data.getStringExtra("OCRResult"));
+ break;
+ case SCAN_CAR_REQUEST:
+ mSuccessText.setText(data.getStringExtra("OCRResult"));
+ break;
}
}
}
diff --git a/app/src/main/java/com/fanjun/orclibs/ScanCarActivity.java b/app/src/main/java/com/fanjun/orclibs/ScanCarActivity.java
new file mode 100644
index 0000000..696f6ff
--- /dev/null
+++ b/app/src/main/java/com/fanjun/orclibs/ScanCarActivity.java
@@ -0,0 +1,221 @@
+package com.fanjun.orclibs;
+
+import android.content.Intent;
+import android.graphics.ImageFormat;
+import android.hardware.Camera;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.WindowManager;
+import android.widget.ImageView;
+
+import com.fanjun.orclibs.Utils.CameraUtils;
+
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import hotcard.doc.reader.NativeOcrPn;
+
+/**
+ * 识别车牌demo
+ */
+public class ScanCarActivity extends AppCompatActivity implements Camera.PreviewCallback, SurfaceHolder.Callback {
+ private SurfaceView surfaceView;
+ private SurfaceHolder surfaceHolder;
+ NativeOcrPn mScanCarApi;
+ Camera mCamera;
+ ImageView view2;
+ boolean success;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_scan_car);
+ surfaceView = findViewById(R.id.mSurfaceView);
+ view2 = findViewById(R.id.view2);
+ CameraUtils.init(this);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
+ WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//禁止息屏
+ this.surfaceHolder = this.surfaceView.getHolder();
+ this.surfaceHolder.addCallback(this);
+ this.surfaceHolder.setType(3);
+ this.mScanCarApi = new NativeOcrPn(new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ switch (msg.what) {
+ case 201:
+ success = true;
+ //识别结果
+ byte[] arrayOfByte = new byte[1024];
+ mScanCarApi.GetResult(arrayOfByte, arrayOfByte.length);
+ //保存图片路径
+ String imagePath = newImgPath();
+ try {
+ mScanCarApi.CarImage(imagePath.getBytes("gbk"));
+ JSONObject localJSONObject1 = new JSONObject(new String(arrayOfByte, "gbk"));
+ //车牌号
+ String mEt_carno = localJSONObject1.getString("Num");
+ //行数
+ String mEt_layer = localJSONObject1.getString("Layer");
+ //颜色
+ String mEt_color = localJSONObject1.getString("Color");
+ Intent i = new Intent();
+ String ocrResult = "车牌号:" + mEt_carno + "\n"
+ + "行数:" + mEt_layer + "\n"
+ + "颜色:" + mEt_color + "\n"
+ + "图片:" + imagePath + "\n";
+ i.putExtra("OCRResult", ocrResult);
+ setResult(RESULT_OK, i);
+ finish();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ });
+ }
+
+ protected void onResume() {
+ super.onResume();
+ }
+
+ private byte[] data;
+
+ @Override
+ public void onPreviewFrame(byte[] data, Camera camera) {
+ this.data = data;
+ }
+
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+
+ try {
+ mCamera = Camera.open(0);//0:后置 1:前置
+ initCamera();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ try {
+ mCamera.setPreviewDisplay(holder);
+ initAutoFocusTimer();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ closeCamera();
+ }
+
+ /**
+ * 初始化相机
+ */
+ void initCamera() {
+ try {
+ mCamera.setPreviewCallback(this);
+ Camera.Parameters parameters = mCamera.getParameters();
+ Camera.Size optionSize = CameraUtils.findBestPreviewResolution(mCamera);
+ parameters.setPreviewSize(optionSize.width, optionSize.height);
+ parameters.setPictureSize(optionSize.width, optionSize.height);
+ parameters.setPreviewFormat(ImageFormat.NV21);
+ parameters.setFlashMode("off");
+ parameters.setPictureFormat(256);
+ parameters.setJpegQuality(100);
+ parameters.set("orientation", "portrait");
+ parameters.set("rotation", 90);
+ mCamera.setDisplayOrientation(90);
+ mCamera.setParameters(parameters);
+ mCamera.startPreview();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 释放相机
+ */
+ void closeCamera() {
+ try {
+ if (autoFocusTimer != null) {
+ autoFocusTimer.cancel();
+ }
+ if (mCamera != null) {
+ mCamera.stopPreview();
+ //mCamera.release();//加上要挂啊
+ mCamera = null;
+ }
+ } catch (Exception e) {
+ }
+ }
+
+ Timer autoFocusTimer;
+
+ void initAutoFocusTimer() {
+ final Camera.Size size = mCamera.getParameters().getPreviewSize();
+ final int[] arrayOfInt = new int[4];
+ arrayOfInt[0] = view2.getLeft();
+ arrayOfInt[1] = view2.getTop();
+ arrayOfInt[2] = view2.getRight();
+ arrayOfInt[3] = view2.getBottom();
+ if (autoFocusTimer == null) {
+ autoFocusTimer = new Timer();
+ autoFocusTimer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ if (mCamera != null) {
+ mCamera.autoFocus(new Camera.AutoFocusCallback() {
+ @Override
+ public void onAutoFocus(boolean suc, Camera camera) {
+ if (mCamera != null) {
+ mCamera.cancelAutoFocus();
+ }
+ }
+ });
+ }
+ if (!success && data != null) {
+ mScanCarApi.ScanCarNo(data, size.width, size.height, arrayOfInt, ScanCarActivity.this);
+ }
+ }
+ }, 0, 300);
+ }
+
+ }
+
+ @Override
+ public void finish() {
+ super.finish();
+ closeCamera();
+ }
+
+ public static String newImgPath() {
+ File localFile = new File(Environment.getExternalStorageDirectory().getPath() + "/ccymimg/");
+ if (!localFile.exists())
+ localFile.mkdirs();
+ return Environment.getExternalStorageDirectory().getPath() + "/ccymimg/" + new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date()) + ".jpg";
+ }
+}
diff --git a/app/src/main/java/com/fanjun/orclibs/ScanIdCardActivity.java b/app/src/main/java/com/fanjun/orclibs/ScanIdCardActivity.java
index 4cd5de6..f5b25fc 100644
--- a/app/src/main/java/com/fanjun/orclibs/ScanIdCardActivity.java
+++ b/app/src/main/java/com/fanjun/orclibs/ScanIdCardActivity.java
@@ -23,8 +23,6 @@
import java.util.Timer;
import java.util.TimerTask;
-import kernal.bankcard.android.BankCardAPI;
-
/**
* 识别身份证开源 demo (驾驶证一样)
* 实际上识别身份证和驾驶证的API是一样的
@@ -32,7 +30,6 @@
public class ScanIdCardActivity extends AppCompatActivity implements Camera.PreviewCallback, SurfaceHolder.Callback {
private SurfaceView mSurfaceView;
private SurfaceHolder surfaceHolder;
- private BankCardAPI bankCardAPI;
Camera mCamera;
ImageView view2;
Handler ocrHandler;
@@ -45,6 +42,8 @@ protected void onCreate(Bundle savedInstanceState) {
view2 = findViewById(R.id.view2);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//禁止息屏
+ this.surfaceHolder = mSurfaceView.getHolder();
+ this.surfaceHolder.addCallback(this);
initHandler();
LibraryInitOCR.initOCR(this);
LibraryInitOCR.initDecode(this, ocrHandler, true);//第三个参数是是否保存图片
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 73e481d..77403da 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -30,6 +30,14 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/mScanDriverCard"
android:text="识别银行卡"/>
+
+
+
+
+
\ No newline at end of file