Android7.0 Settings备忘录
背景:项目中有个需求,有使用到Android7.0的Settings模块,动态设置(可点击/不可点击)Settings主界面的指纹模块。这个模块之前没有接触过,写点东西记录踩过的坑。
1、Android7.0 Settings模块总览
[link] https://blog.csdn.net/H_Gao/article/details/58201121
相比之前的版本,Android7.0的Settings模块在主界面中增加了侧滑栏,由此也对Settings模块进行了重构。UI侧的代码主要位于/packages/apps/Settings/src/com/android/settings/ 下;framework侧代码主要位于/frameworks/base/packages/SettingsLib/src/com/android/settingslib/下。主界面的滑动由RecyclerView实现,侧滑栏的滑动由ListView实现。
2、Settings重要的类说明
SettingsDrawerActivity:Settings主要的Activity,主界面及侧滑栏的Activity实现。
DashboardContainerFragment:主界面的Fragment实现。
DashboardAdapter:主界面RecyclerView的adapter,ViewItem的点击事件在这个类里实现。
SettingsDrawerAdapter:侧滑栏ListView的adapter。
TileUtils:Settings的分类及Item生成实现。
3、有关指纹
Android自6.0引入指纹,指纹由FingerprintService/FingerprintManager统一管理,FingerprintManager是Framework对上层APP提供接口,FingerprintService是一个系统service,详细可查看API。
在APP侧获取指纹服务的方法:
mFingerprintManager = (FingerprintManager) activity.getSystemService(Context.FINGERPRINT_SERVICE);
在system service中获取指纹服务的方法:
IBinder binder = ServiceManager.getService(Context.FINGERPRINT_SERVICE);
IFingerprintService service = binder == null ? null : IFingerprintService.Stub.asInterface(binder);
4、其他说明
1、Settings ViewItem条目Icon的生成
这些Icon没有直接使用图片生成,使用了Vector DataPath来生成。有关DataPath请参考 [link] https://www.cnblogs.com/yuhanghzsd/p/5466846.html
2、修改Item图标与侧滑栏图标不同步问题
这个问题困扰了比较久,参考[link] https://blog.csdn.net/mr_kings/article/details/78500559
3、踩过的坑
有一个场景,需要删除所有已经录入的指纹,调用fingerprintservice.getEnrolledFingerprints获取所有指纹再依次删除,始终会有指纹被漏删,抛出异常FINGERPRINT_ERROR_CANCELED、FINGERPRINT_ERROR_HW_UNAVAILABLE,没有找到原因。根据代码:
/* Cancel pending enroll or authenticate, sending FINGERPRINT_ERROR_CANCELED to all running clients. Switches the HAL state machine back to the idle state. Unlike enroll_done() doesn't invalidate the pre_enroll() challenge. Function return: 0 if cancel request is accepted or a negative number in case of error, generally from the errno.h set. */
int (*cancel)(struct fingerprint_device *dev);
推测指纹删除这块和HAL的实现有关,没找到解决办法。只能把所有需要使用指纹的地方堵住,规避了这个坑。
谷歌在每个版本的Android码源中都会对既有代码进行优化和重构,也是非常好的学习代码架构的方法。同时,Settings中条目的刷新也是挺复杂的一块,留到以后学习。