我正在开发电子护照阅读器应用程序,我已经关注了一些较旧的问题,并且我已使用以下代码成功连接到护照.
我的问题是我无法理解如何读取存储在护照中的所有数据(姓名,照片……).
这是我使用过的代码,应用程序运行良好(靠近NFC标签时提示).
我的问题是我无法理解如何读取存储在护照中的所有数据(姓名,照片……).
这是我使用过的代码,应用程序运行良好(靠近NFC标签时提示).
@Override protected String doInBackground(Tag... params) { //Tag tag = params[0]; Intent intent = getIntent(); //Log.d(TAG,"params " + intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)); Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); IsoDep dep = IsoDep.get(tag); if (dep == null) { // IsoDep is not supported by this Tag. return null; } byte[] CMD = { (byte)0x00,/* CLA = 00 (first interindustry command set) */ (byte)0xA4,/* INS = A4 (SELECT) */ (byte)0x04,/* P1 = 04 (select file by DF name) */ (byte)0x0C,/* P2 = 0C (first or only file; no FCI) */ (byte)0x07,/* Lc = 7 (data/AID has 7 bytes) */ /* AID = A0000002471001: */ (byte)0xA0,(byte)0x00,(byte)0x02,(byte)0x47,(byte)0x10,(byte)0x01 }; byte[] GET_RANDOM = { (byte) 0x00,// CLA Class (byte) 0x84,// INS Instruction (byte) 0x00,// P1 Parameter 1 (byte) 0x00,// P2 Parameter 2 (byte) 0x0E // LE maximal number of bytes expected in result }; try { dep.connect(); byte[] result = dep.transceive(CMD);// CONNECT Log.d(TAG,"result " + result[0] + " " + (byte)0x90); if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00)) throw new IOException("could not select applet"); if(dep.isConnected()==true) Log.d(TAG,"IS CONNECTED!"); else Log.d(TAG,"ISN'T CONNECTED!"); result = dep.transceive(GET_RANDOM); // EXEC A CMD int len = result.length; if (!(result[len-2]==(byte)0x90 && result[len-1]==(byte) 0x00)) throw new RuntimeException("could not retrieve msisdn"); byte[] data = new byte[len-2]; System.arraycopy(result,data,len-2); String str = new String(data); Log.d(TAG,str); dep.close(); } catch (IOException e1) { e1.printStackTrace(); } return null; }
解决方法
您需要针对您的epassport制作
BAC(基本访问控制),以便能够阅读护照上印刷的基本信息(国家,姓名,姓氏,国籍,出生日期,性别……)和机读区(机读)区域,也就是护照底部的两条大线).所有这些信息都位于DG(数据组)1中,照片位于DG2中.您可以在其他DG中找到其他信息,例如DG3需要读取EAC(扩展访问控制),因为它包含敏感数据(指纹).
您可以使用JMRTD库从Android手机中读取它.市场上有一个“演示”Android应用程序here.否则,您可以开始阅读位于here的ICAO(国际民用航空组织)的官方文档.在本文档的末尾,您可以找到一些示例,以便您可以自己实施的BAC.
您还可以查看the JMRTD source code以帮助您编写代码. IMO编码非常复杂,但学习起来非常有趣.你写的代码是一个好的开始!