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="识别银行卡"/> +