虹软人脸识别因IMEI变化导致授权失败
- 开发平台基本信息
- 补丁下载地址
- 前言
- 问题描述
- 解决方法
- 结尾
开发平台基本信息
芯片: 高通SDM450
版本: Android 9.0
kernel: msm-4.9
补丁下载地址
https://gitee.com/Hebin320/csdn_patch
前言
在人脸识别终端上,使用人脸识别算法软件进行授权,使得终端具有人脸识别的能力;目前我们的设备接入的人脸识别算法有虹软以及旷视;这两家公司在算法绑定设备的方式上大同小异,都是通过Android标准的api获取到设备的一些硬件信息,例如wifi的mac地址,以太网的mac地址以及IMEI等等;然后将获取的硬件信息传到他们的平台上进行绑定,如果已授权的机器的硬件信息发生改变,那么算法授权就会失效,解决办法就是,要么将硬件信息恢复到授权时候的信息;要么重新授权,而重新授权一个授权码要一百多;所以,当遇到设备终端发生硬件信息改变时,要尽可能找出硬件信息改变的原因,因为这些算法软件是通过Android标准api获取,所以,找到他们获取信息的接口,将接口的返回值修改成统一的返回值,即可解决硬件信息改变的问题。
问题描述
我们的设备终端在使用虹软的算法进行授权时,出现了硬件信息发生改变的情况,通过虹软的后台可以查到授权时是获取终端的IMEI,而授权失败时,获取到的是终端的MEID。
解决方法
虹软获取IMEI的方式,优先是使用getDeviceId,然后再使用getImei,最后使用getMeid;而当设备终端插入的卡是联通、移动或者电信4G卡时,获取的仍然是终端的IMEI;只有当设备插入空白电信卡或者电信2G卡时,才会获取终端的MEID。所以,解决方法就是将getDeviceId的返回值改成一直都返回IMEI,不再根据卡的类型返回IMEI或者MEID;修改文件路径是:
frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaPhone.java
具体修改patch如下:
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
old mode 100644
new mode 100755
index 4ab7240..56ac743
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -1456,21 +1456,22 @@ public class GsmCdmaPhone extends Phone {@Overridepublic String getDeviceId() {
- CarrierConfigManager configManager = (CarrierConfigManager)
- mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
- boolean force_imei = configManager.getConfigForSubId(getSubId())
- .getBoolean(CarrierConfigManager.KEY_FORCE_IMEI_BOOL);
-
- if (isPhoneTypeGsm() || force_imei) {
- return getImei();
- } else {
- String id = getMeid();
- if ((id == null) || id.matches("^0*$")) {
- loge("getDeviceId(): MEID is not initialized use ESN");
- id = getEsn();
- }
- return id;
- }
+ // CarrierConfigManager configManager = (CarrierConfigManager)
+ // mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ // boolean force_imei = configManager.getConfigForSubId(getSubId())
+ // .getBoolean(CarrierConfigManager.KEY_FORCE_IMEI_BOOL);
+
+ // if (isPhoneTypeGsm() || force_imei) {
+ // return getImei();
+ // } else {
+ // String id = getMeid();
+ // if ((id == null) || id.matches("^0*$")) {
+ // loge("getDeviceId(): MEID is not initialized use ESN");
+ // id = getEsn();
+ // }
+ // return id;
+ // }
+ return mImei;}@Override
结尾
差不多有三年的时间没写博客了,自从上次换了工作,从Android应用开发转到Android系统开发之后,就把博客给搁置下了;现在想把这两年多学的东西全都写下来,记录下来;可能更多的会是一些系统层的知识。已经有很长一段时间没去研究过应用开发的一些新知识了,最近也是在恶补应用的知识,现在Android的市场的确不是那么好,但是,我也相信,只要学得精,还是会有出路的,毕竟三十六行,行行出状元。