support-v4 包中FingerprintManagerCompat无法使用指纹问题

之前在中兴的时候,在L版本时期自研指纹框架,当时也只提供给了公司内部模块使用,并没有什么问题。
在升级到M之后,作为系统标准接口,三方应用使用该接口的也多了起来。与公司的合作项目中,在使用指纹接口发现指纹无法使用。
首先我们确定指纹器件是没有问题的,指纹解锁,支付等功能都正常。自己单独写了demo检查也没发现问题。与合作公司沟通,了解到他们使用的是support-v4 包中FingerprintManagerCompat。同时在小米的M版本机型中同样存在该问题。
于是开始排查,问题很直接,很明显:

private static FingerprintManager getFingerprintManagerOrNull(@NonNull Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
        return context.getSystemService(FingerprintManager.class);
    } else {
        return null;
    }
}

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)返回false。

进入PackageManagerService(SDK中源码位置Sdk/sources/android-27/com/android/server/pm,编译环境中/frameworks/base/services/core/java/com/android/server/pm/
,可通过AndroidXRef查看),查看

public boolean hasSystemFeature(String name, int version) {
    // allow instant applications
    synchronized (mAvailableFeatures) {
        final FeatureInfo feat = mAvailableFeatures.get(name);
        if (feat == null) {
            return false;
        } else {
            return feat.version >= version;
        }
    }
}

得知系统会在PMS的构造函数中进行AvailableFeatures的缓存,

 public PackageManagerService(Context context, Installer installer,
        boolean factoryTest, boolean onlyCore) {
    ...
    SystemConfig systemConfig = SystemConfig.getInstance();
    mGlobalGids = systemConfig.getGlobalGids();
    mSystemPermissions = systemConfig.getSystemPermissions();
    mAvailableFeatures = systemConfig.getAvailableFeatures();
    ...
}

进一步查看SystemConfig源码(SDK中源码位置Sdk/sources/android-27/com/android/server/,编译环境中/frameworks/base/core/java/com/android/server/
)中在SystemConfig构造函数中会在 /system/etc/sysconfig , /system/etc/permissions ,/vendor/etc/sysconfig , /vendor/etc/permissions ,/oem/etc/sysconfig , /oem/etc/permissions ,/odm/etc/sysconfig , /odm/etc/permissions 几个目录中去加载feature,要求为xml文件。内容为

<permissions>
    <feature name="android.hardware.fingerprint" />
</permissions>

在编译环境中搜索 /frameworks/native/data/etc/
下存在android.hardware.fingerprint.xml

在检查公司自定义的脚本中,漏掉了对该文件的拷贝,修改mk文件,将改文件拷贝至system/etc/permissions/下后恢复正常。

如果不用V4包中的FingerprintManagerCompat,而是用M后SDK中FingerprintManagerz中isHardwareDetected()和hasEnrolledFingerprints()来判断并不会出问题,而我们内部总是这样用的。但是对于第三方开发者来说,这种差异化却是不必要的麻烦。在后续工作应该多注意规避这些低级错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,389评论 25 709
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,825评论 2 45
  • 6月16日,第三天。 在香格里拉睡了一夜,早起头还是有些疼。 以后也许我再也不会来这个地方了。早晨还有一些留恋这里...
    苍耳的后院阅读 815评论 3 1
  • 今年的大枣真是难吃,感觉就像你去借钱,墨迹了半天才借你,而往年的大枣,就像,你借钱了,人家马上能答应借你,并且很乐意,
    刘悠茸阅读 432评论 0 0

友情链接更多精彩内容