安卓端Morpho指纹扫描仪采集指纹报错自动断开问题
Morpho Device安卓端指纹采集报错修复
报错对应触发逻辑
三个错误码的实际触发原因:
error code 100:传入的PID_OPTIONSXML字符串不符合UIDAI RD Service规范,直接触发格式校验失败error code 140:参数调整后仍存在违规项,或设备连接异常、RD Service未授权/未激活、设备未完成注册error code 999:参数非法或服务状态异常触发的连锁错误,会直接导致设备主动断开连接
原有代码的XML违规点
你定义的responseXml存在5个明确的规范违反问题:
fType属性语法完全错误:fType="0"|fType="1"|fType="2"是非法写法,fType为单值属性,单指纹采集场景固定传fType="2"即可,不允许用竖线拼接多个同名属性- 存在非法冗余节点:
<Demo></Demo>不属于PidOptions规范允许的子节点,规范中PidOptions根节点下仅允许Opts、CustOpts两个直接子节点 - 空值属性违规:
iCount、iType、pCount、pType、pTimeout、otp、wadh、posh这类不需要传参的属性,不能留空值保留在标签中,必须直接删除,空字符串会被判定为参数非法 - 属性格式错误:
env = "P"中等号两侧加了多余空格,XML属性语法要求等号前后不能有空格 - 空参数节点违规:
<Param name="" value="" />属于无意义空节点,没有自定义参数传递时必须删除
修复后代码
1. 修正后的PID_OPTIONS XML定义
String responseXml = "<PidOptions ver=\"1.0\">" + "<Opts env=\"P\" fCount=\"1\" fType=\"2\" format=\"0\" pidVer=\"2.0\" timeout=\"10000\"/>" + "<CustOpts></CustOpts>" + "</PidOptions>"; private static final int AUTHENTICATION_REQUEST = 0;
2. 补充回调异常处理
原有onActivityResult仅处理成功回调,无法拿到错误场景的返回信息,补充异常分支逻辑:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == AUTHENTICATION_REQUEST) { Bundle b = data != null ? data.getExtras() : null; if (resultCode == RESULT_OK && b != null) { String pidData = b.getString("PID_DATA"); Toast.makeText(this, "pidData"+pidData, Toast.LENGTH_SHORT).show(); String dnc = b.getString("DNC", ""); String dnr = b.getString("DNR", ""); txt.setText(pidData); } else { // 处理错误场景,从bundle中取错误码、错误信息排查问题 if (b != null) { String errCode = b.getString("ERR_CODE", ""); String errMsg = b.getString("ERR_MSG", ""); Toast.makeText(this, "采集失败:"+errCode+" "+errMsg, Toast.LENGTH_SHORT).show(); } } } }
额外注意事项
- 测试前确认Morpho RD Service已安装激活,已授予存储、USB访问权限,设备已完成注册
- 不要保留XML注释内容在传入的参数字符串里,部分版本RD Service会把注释判定为非法内容
- 采集前可以先通过RD Service提供的状态查询接口确认设备连接正常,再发起采集请求
内容的提问来源于stack exchange,提问作者shweta
相关产品推荐
相关产品推荐

