更新记录

2.1.00(2020-09-08)

1.全屏弹窗页面。

2.0.02(2020-08-31)

1.安卓增加提示框。

2.0.01(2020-08-05)

1.iOS增加关闭按钮。

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 11.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 适用版本区间:9 - 14

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


以下为本插件《接入文档》

特别推荐

体验 app 下载码,密码 123456

安卓手机,用浏览器扫码下载体验,下载密码 123456。

qrcode.png

1 前言

本插件主要采用百度文字识别 OCR 功能,实现身份证识别,银行卡识别,护照识别和车牌识别等文字识别。

2 包名准备(有偿提供 iOS 测试证书)

包名是用来标识项目的,每个项目唯一。安卓和 iOS 的包名,同一个项目强烈建议使用一样的,以免搞混。注意使用三段式 com.xxx.xxx,如我的 com.longyoung.xiangmuming(一般用反域名,不容易和别人的冲突,如我的域名:www.longyong.com)。注意:uniapp 打包或者打基座要用这个包名。获取付费 iOS 测试证书,请关注公众号咨询。

3 百度官方资料准备

百度文字识别创建应用,点击查看方法。下载 License 文件,请注意看「授权文件(安全模式)」,点击查看方法。创建时注意勾选需要包名,如图。

baoming.png

4 接入步骤(关注公众号 longyoung 可沟通咨询)

4.1 在项目根目录创建文件夹 nativeplugins,购买插件(建议测试版本点击购买下方的试用,正式发布的时候再购买。老用户复购有优惠,微信公众号 longyoung 回复「插件复购」获取优惠,量大从优,介绍新用户购买有提成)。

4.2 将百度授权文件 License 放到,安卓:nativeplugins/longyoung-BDOCR/android/assets/aip-license;iOS:nativeplugins/longyoung-BDOCR/ios/aip-license。注意必须完全一致,没路径的请自行创建,nativeplugins 文件夹在项目根目录下。注意 iOS 没有 assets 文件夹,直接放到 ios 文件夹下。

uniapp1.png

4.3 manifest.json 文件,选中「App 原生插件配置」,选中云端插件,勾选插件对应的插件。

uniapp2.png

4.4 调用插件,代码如下:

<script>
    var lyBDOCR;
    export default {
        data() {
            return {
                type: 'IDCardFront',
                accuracy: 'auto',
                detectDirection: 0,
                isAutoTakePhoto: 0,

                resultStr: "",
                imgBase64Str: ""
            }
        },
        onLoad() {
            // #ifdef APP-PLUS
            //引用插件
                lyBDOCR = uni.requireNativePlugin('longyoung-BDOCR');
            // #endif
        },
        methods: {
            Btn() {
                console.error("lygg.Btn");

                let that = this;
                lyBDOCR.startOCRLy({
                        //type
                        //IDCardFront 身份证正面识别、IDCardBack 身份证反面识别、bankCard 银行卡识别、passport 护照识别。
                        //105通用文字识别(含位置信息版)、106通用文字识别、107通用文字识别(高精度版)、108通用文字识别(含位置信息高精度版)、109通用文字识别(含生僻字版)
                        //110网络图片识别、120行驶证识别、121驾驶证识别、122车牌识别、123营业执照识别、124通用票据识别、126数字识别、127二维码识别
                        //128名片识别、129手写文字识别、130彩票识别、131增值税发票识别、132自定义模板
                        type: this.type, 
                        accuracy: this.accuracy, //支持这三个字符串:auto、normal、high,精准度,精度越高,速度越慢。default:auto
                        //detectDirection: this.detectDirection,//是否检测图像朝向,0不检测,1检测
                        isAutoTakePhoto:this.isAutoTakePhoto//仅身份证有效,是否自动拍照,0手动,1自动
                    }, result => {

                        console.log('result.all=' + JSON.stringify(result)); //返回结果全部打印
                        if (result.bestImgBase64) {
                            // that.imgBase64Str = "data:image/png;base64," + result.bestImgBase64.replace(/[\r\n]/g, ""); //显示图片
                            that.bestImgBase64Str = result.bestImgBase64;
                            that.resultStr = that.resultStr + "\n\n======base64字符串(太长,截取前200字符):\n" + result.bestImgBase64.substring(0, 200);
                            delete result.bestImgBase64; //删除bestImgBase64
                        }
                        that.resultStr = that.resultStr + "\n======不包含图片部分:\n" + JSON.stringify(result);
                        console.log('result.noImg=' + JSON.stringify(result)); //返回结果,不含图片打印

                        //***使用 uni.uploadFile()上传服务器,不需要将图片上传到服务器的,注释此处代码。
                        //https://ask.dcloud.net.cn/question/30546, https://ask.dcloud.net.cn/question/76827
                        //http://www.html5plus.org/doc/zh_cn/io.html#plus.io.URLType, https://ask.dcloud.net.cn/article/94
                        if (that.bestImgBase64Str) {
                            var bitmapT = new plus.nativeObj.Bitmap('test');
                            //加载base64图片
                            bitmapT.loadBase64Data(that.bestImgBase64Str, function(res) {
                                console.log("longyoung.loadBase64Data.suc=" + JSON.stringify(res));
                                var options = {
                                    overwrite:true,//覆盖同名图片
                                    format:'png',
                                    quality:50
                                };
                                //保存base64图片,请不要私自改变 _doc/ 除非你明确的知道 Bitmap.save() 的用法。
                                bitmapT.save("_doc/ocr1.png", options, function(res) {
                                    bitmapT.clear(); //销毁bitmap对象
                                    console.log("longyoung.save.suc=" + JSON.stringify(res));

                                    that.imgBase64Str = res.target;//显示图片

                                    //图片上传服务器
                                    uni.uploadFile({
                                        url: 'http://api.longyoung.com/api/open/common/uploadImgTemp', //图片上传地址,填你们自己的,详情查看 uni.uploadFile(OBJECT) 这个 api。
                                        filePath: res.target,
                                        method: 'post',
                                        name: 'imgFile', //上传图片参数名,填你们自己的,详情查看 uni.uploadFile(OBJECT) 这个 api。
                                        success: (res) => {
                                            var data = res.data;
                                        },
                                        fail: (res) => {
                                            console.log("longyoung.uploadFile.fail=", res);
                                            // uni.showToast({
                                            //  title:'图片上传错误',
                                            //  icon:'none'
                                            // })
                                        }
                                    });

                                }, function(res) {
                                    console.log("longyoung.save.fail=", res);
                                    uni.showModal({
                                        title: 'bitmap保存错误',
                                        content: JSON.stringify(res)
                                    });
                                });

                            }, function(res) {
                                console.log("longyoung.fail=", res);
                                uni.showModal({
                                    title: 'base64转bitmap错误',
                                    content: JSON.stringify(res)
                                });
                            });
                        }
                        //***使用 uni.uploadFile()上传服务器,不需要将图片上传到服务器的,注释此处代码。

                    });

            },
        }
    }
</script>

4.5 打自定义基座(以安卓为例,iOS 类似)

需要打自定义基座才可以进行测试,运行->运行到手机或模拟器->制作自定义基座。注意事项看图片,请使用自己的证书(就是签名文件.jks)。每次打自定义基座的时候,切记先把旧的基座删除(如果存在),路径在根目录下的 unpackage 文件夹里面(LyBDFaceAuthDemo\unpackage\debug\android_debug.apk)。

<img "https://i.loli.net/2020/05/13/q36VUXAE5IMbW4i.png" alt="" />

jizuo1.png

ocr1.png

4.6 勾选自定义基座后运行

运行->运行到手机或模拟器->运行基座选择,勾选自定义调试基座,之后运行到设备,如下图。如发现运行之后不是最新的,请先删除手机里面旧的应用,再重新运行。

uni8.png

常见问题

Q1:当前运行的基座不包含原生插件,怎么解决?

A:注意看上面的步骤 4.5 和 4.6,解决要点是删除旧的,不要怕麻烦,删除旧的基座和应用,可能存在缓存。

Q2:undefined is not an object (evaluating 'lyBDOCR.startOCRLy')是什么问题?

A:首先检查是否是上述 Q1 的问题。如还不行,说明插件引用不成功,打日志看看引用插件代码有没有执行(引用代码前后打 console 就可判断)。特别注意组件模式,要在对应的生命周期方法,调用引用插件的代码。

Q3:为什么安卓能识别,iOS 不可以?

A:安卓和 iOS 返回数据的结构不一样,您需要分别调试打印返回结果,根据结果获取对应的值。也就是说,安卓和 iOS 的取值方法不一样,需要写不同的代码取值。

版权归开发者所有,最终解释权归作者所有。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

摄像头权限。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件自身不采集任何数据,插件使用百度ocr文字识别SDK采集数据,请参考其官方说明:https://ai.baidu.com/ai-doc/OCR/ok3h7xx8c

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无。

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问