那些年,调试android 8.0指纹遇到的坑

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明

##那些年,调试android 8.0指纹遇到的坑##

###前言###
阅读本篇文章之前,您最好需要看下上一篇文章android O版本指纹识别,对android 8.0 的指纹有个初步的认识
###1.指纹服务不能自动###
指纹服务fingerprintd(biometrics fingerprintservice),可以手动起来,但是在init.rc中无法启动。

解决办法:

1.抓取开机时kernel log ,确认我们的启动指纹服务的init.rc 文件有被init.cpp加载进来,如图所示
biometrics.fingerprint@2.1-service

注: push 进去的init.rc 要跟目录里面的其他权限保持一致,指纹的init.rc 文件在系统目录:vendor/etc/init

2.不论SELinux策略是否关闭,你都需要写好你的te文件。

3.请用adb shell ls -lZ 查看你的 service 文件,看下文件类型是不是同你在te文件file_contexts里面注册的文件类型一样,如图所示
biometrics_fingerprint_service_file

###2.指纹服务不能回调给framework###
framework调用IBiometricsFingerprint接口enumedate方法时,指纹服务fingerprintd 的enumedate方法能够被调用
但是我们回调notify(&message) 时候,framework中的回调函数onEnumerate()不能执行。

解决办法:

在你的biometrics fingerprint service te 文件里面用vndbinder_use(xx) 代替 binder_use(xx),如下图所示
te
xx指你的biometrics fingerprint service

###3.enroll时候报错###
在hal层成功加载之后,进入到enroll界面。发现还没有录入,就自动退出enroll界面。
framework 在enroll 之前会调用 enumedate(),cancel(),pre_enroll() 等函数,如果这些函数,没执行成功,或者return 一个错误的值。
就enroll 不了。

解决方法:

实现上述的函数,按照要求,返回或者回调相关的值。

###4.enumedate()函数策略问题###
此函数是枚举 所有的指纹模板。需要你一个一个回调给framework

1.指纹id为0时候,需要gid = 0;fid = 0;remaining_templates = 0

2.当指纹id不为0的时候,需要把gid ,fid,remaining_templates 报上去
当时最后一个模板的时候,remaining_templates要为0

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android 8.0 及以上版本,为了增强应用程序的安全性,Android 引入了后台限制,禁止未在前台运行的应用程序启动服务。如果您想在后台启动服务,需要使用 `startForegroundService()` 方法。这个方法会启动一个前台服务,然后你可以在服务启动后在通知栏显示一个通知,以此来告知用户服务正在运行。 以下是一个使用 `startForegroundService()` 的示例代码: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 创建一个 NotificationChannel NotificationChannel channel = new NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT); // 向系统注册 NotificationChannel NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); } // 创建一个 Intent,启动你的服务 Intent serviceIntent = new Intent(this, YourService.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 在 Android 8.0 及以上版本上,需要调用 startForegroundService() 方法启动服务。 startForegroundService(serviceIntent); } else { // 在 Android 8.0 以下版本上,可以直接调用 startService() 方法启动服务。 startService(serviceIntent); } ``` 注意:如果你使用的是 `startForeground()` 方法,会在 Android 8.0 及以上版本上抛出 `IllegalStateException` 异,因为 Android 8.0 及以上版本禁止在后台启动服务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想全栈程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值