IdCardOCR

Project Url: XieZhiFa/IdCardOCR
Introduction: 身份证正反面识别,身份证扫描识别,二代身份证 OCR 识别,OCR 极速识别身份证所有信息正反面均可。离线无需联网,极速秒扫。
More: Author   ReportBugs   
Tags:

项目说明

极速识别中国二代身份证(无需联网,离线秒扫,极速识别)身份证所有信息, 包含 姓名、性别、出生年月、详细地址,正反面。 本应用使用相机进行识别中国二代身份证信息正反面,也可以选择相册中的图片 不需要联网即可离线识别身份证所有信息包括新疆少数民族身份证,全网仅此一个,识别速度快,识别率高, 可保存识别图片。

扫描示例

Application 中初始化

LibraryInitOCR.initOCR(context);

调用扫描界面

Bundle bundle = new Bundle();
bundle.putBoolean("saveImage", binding.saveImage.getSelectedItemPosition() == 0 ? true : false); // 是否保存识别图片
bundle.putBoolean("showSelect", true);                          // 是否显示选择图片
bundle.putBoolean("showCamera", true);                          // 显示图片界面是否显示拍照(驾照选择图片识别率比扫描高)
bundle.putInt("requestCode", REQUEST_CODE);                     // requestCode
bundle.putInt("type", binding.type.getSelectedItemPosition());  // 0 身份证, 1 驾驶证

//broadcastAction 将扫描结果广播出去, 注意增加 intent.addCategory(context.getPackageName());
//如果不需要广播,就不会传这个参数
bundle.putString("broadcastAction", broadcastAction);
LibraryInitOCR.startScan(context, bundle);


//如果您不想集成 aar, 那么可以通过隐式意图拉起示例中的扫描界面

/*
//身份证:com.msd.ocr.idcard.ICVideo, 驾驶证: com.msd.ocr.idcard.id.DIVideoActivity
Intent intent = new Intent("com.msd.ocr.idcard.ICVideo");
intent.putExtra("bundle", bundle);                         //具体参数如上
intent.addCategory(getPackageName());                      //调用 demo 中的扫描界面使用: com.tomcat.ocr.idcard
startActivityForResult(intent, REQUEST_CODE);
 */

//返回的结果都是一样的. 但是选择图片的时候头像暂时不能提取.

返回结果

识别结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE && resultCode == RESULT_OK){
        String result = data.getStringExtra("OCRResult");
        try {
            JSONObject jo = new JSONObject(result);
            StringBuffer sb = new StringBuffer();
            sb.append(String.format("正面 = %s\n", jo.opt("type")));
            sb.append(String.format("姓名 = %s\n", jo.opt("name")));
            sb.append(String.format("性别 = %s\n", jo.opt("sex")));
            sb.append(String.format("民族 = %s\n", jo.opt("folk")));
            sb.append(String.format("日期 = %s\n", jo.opt("birt")));
            sb.append(String.format("号码 = %s\n", jo.opt("num")));
            sb.append(String.format("住址 = %s\n", jo.opt("addr")));
            sb.append(String.format("签发机关 = %s\n", jo.opt("issue")));
            sb.append(String.format("有效期限 = %s\n", jo.opt("valid")));
            sb.append(String.format("整体照片 = %s\n", jo.opt("imgPath")));
            sb.append(String.format("头像路径 = %s\n", jo.opt("headPath")));
            sb.append("\n 驾照专属字段\n");
            sb.append(String.format("国家 = %s\n", jo.opt("nation")));
            sb.append(String.format("初始领证 = %s\n", jo.opt("startTime")));
            sb.append(String.format("准驾车型 = %s\n", jo.opt("drivingType")));
            sb.append(String.format("有效期限 = %s\n", jo.opt("registerDate")));
            binding.textview.setText(sb.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

aar 集成方法

将文件 aar 文件复制到 libs 目录下, 然后在 build.gradle 中增加:

android{
    repositories {
        flatDir {
            dirs 'libs'
        }
    }

    manifestPlaceholders = [
        //debug.keystore 生成, 正式包需要重新生成.
        //**注意: 一个 KEY 只绑定一个 applicationId 多渠道打包需要注意**
        "OCR_API_KEY" : "26f1f6a0d4d7cb0dd0e9b28f4cedef83"    
    ]
    ndk {
        abiFilters 'armeabi', 'armeabi-v7a', 'x86'
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation (name: 'library-ocr-1.0.4-SNAPSHOT', ext: 'aar')

    //使用 OCR aar 包 图片选择需要依赖另外一个库
    implementation 'com.squareup.picasso:picasso:2.4.0'
    implementation(name: 'library-multi-image-selector-1.0.5-SNAPSHOT', ext: 'aar')

}

自定义识别框方式集成

如果当前扫描界面无法满足,您可以自己开发相机预览界面,使用以下 API 进行识别.

//1. Application 中初始化
LibraryInitOCR.initOCR(context); 

//2. 初始化解码器
/**
 * 解码器初始化, 如果需要保存图片, 需要在调用向系统审核 SDCard 读写权限.
 * @param context   Activity
 * @param handler   接收解码消息
 * @param isSaveImage   是否保存图片
 */
public static void initDecode(Context context, Handler handler, boolean isSaveImage)



//3. 开始解码
/**
 * 开始解码, 将相机预览数据传递到这里来, onPreviewFrame(byte[] data, Camera camera)
 * @param rect  预览框对象
 * @param previewWidth  界面预览宽
 * @param previewHeight 界面预览高
 * @param data  相机预览数据
 */
public static void decode(Rect rect, int previewWidth, int previewHeight, byte[] data)


/**
 * 识别选择的身份证图片(注意提前申请读写权限)
 * @param filePath  文件路径
 */
public static void decode(String filePath)


//4.在 Activity onDestroy 释放资源
/**
 * 释放资源
 */
public static void closeDecode()



//解码结果通过 handler 接收
switch (msg.what){
    //解码成功
    case LibraryInitOCR.DECODE_SUCCESS: {
        Intent intent = (Intent) msg.obj;
        String result = intent.getStringExtra("OCRResult");
        String headImg = intent.getStringExtra("headImg");
        String fullImg = intent.getStringExtra("fullImg");
        break;
    }

    //解码失败
    case LibraryInitOCR.DECODE_FAIL:{
        break;
    }

    //未授权
    case LibraryInitOCR.DECODE_UNAUTHORIZED:{
        break;
    }

    //提示重新聚焦
    case LibraryInitOCR.DECODE_AUTO_FOCUS:{
        break;
    }
}

混淆排除

已经自动管理混淆,不需要再单独设置混淆排除了

更新日志

1.0.1
初始版本提交, 相机直接扫描身份证识别.


1.0.2
1. 增加选择图片识别.
2. 增加用户自定义扫描框识别.


1.0.3
1. 增加驾驶证识别.
2. 选择图片界面增加相机拍照.
3. 暂时不支持用户自定义扫描框识别驾驶证.


1.0.4 
1. 增加自定义扫描框调用示例.
2. 自定义扫描 Handler 不回调等优化.

1.0.5
1. 增加通过广播来返回数据.
2. 统一用 LibraryInitOCR.startScan(context, bundle);启动扫描界面.
3. 代理混淆自动管理.

技术支持 QQ:2227421573

授权密钥请扫描码(image/pay.png)
并将 applicationId 及正式包 sha1 发给我,我给你 KEY.
sha1 查看方式: 
命令行进入签名文件所在的目录执行:
keytool -list  -v -keystore 签名文件.keystore -storepass 签名文件密码

证示例图

对着电脑扫描识别率会比较低, 建议使用身份证原件做测试.

身份证示例图 身份证示例图

Apps
About Me
Google+: Trinea trinea
GitHub: Trinea