指纹框架--指纹选项加载(一)

来源:互联网 发布:js获取当前点击的元素 编辑:程序博客网 时间:2024/04/30 03:40

一、概述

  近几年手指指纹识别快速发展,基本所有的手机都配套指纹识别器;Android6.0开始Google提供标准的上层指纹框架。下面先分析一下;系统中的设置是如何判断要不要加载指纹选项?

二、指纹框架示意图

这里写图片描述

三、指纹选项加载过程

1、–>SecuritySettings.java 入口

1.1 onResume()

    public void onResume() {        super.onResume();        // Make sure we reload the preference hierarchy since some of these settings        // depend on others...        createPreferenceHierarchy();        ............    }

1.2 createPreferenceHierarchy()

 private PreferenceScreen createPreferenceHierarchy() {       ...............        // Fingerprint and trust agents信托代理        PreferenceGroup securityCategory = (PreferenceGroup)                root.findPreference(KEY_SECURITY_CATEGORY);        if (securityCategory != null) {            maybeAddFingerprintPreference(securityCategory);//是否加载指纹选项            addTrustAgentSettings(securityCategory);        }       ...............    }

1.3 maybeAddFingerprintPreference()

    private void maybeAddFingerprintPreference(PreferenceGroup securityCategory) {        FingerprintManager fpm = (FingerprintManager) getActivity().getSystemService(                Context.FINGERPRINT_SERVICE);//获取指纹服务        if (!fpm.isHardwareDetected()) {//判断硬件是否支持指纹功能            Log.v(TAG, "No fingerprint hardware detected!!");            return;        }        Preference fingerprintPreference = new Preference(securityCategory.getContext());        fingerprintPreference.setKey(KEY_FINGERPRINT_SETTINGS);        fingerprintPreference.setTitle(R.string.security_settings_fingerprint_preference_title);        Intent intent = new Intent();        final List<Fingerprint> items = fpm.getEnrolledFingerprints();        final int fingerprintCount = items != null ? items.size() : 0;        final String clazz;        if (fingerprintCount > 0) {            fingerprintPreference.setSummary(getResources().getQuantityString(                    R.plurals.security_settings_fingerprint_preference_summary,                    fingerprintCount, fingerprintCount));            clazz = FingerprintSettings.class.getName();        } else {            fingerprintPreference.setSummary(                    R.string.security_settings_fingerprint_preference_summary_none);            clazz = FingerprintEnrollIntroduction.class.getName();        }        intent.setClassName("com.android.settings", clazz);        fingerprintPreference.setIntent(intent);        securityCategory.addPreference(fingerprintPreference);    }

2、FingerprintManager.java

    public boolean isHardwareDetected() {        if (mService != null) {            try {                long deviceId = 0; /* TODO: plumb hardware id to FPMS */                return mService.isHardwareDetected(deviceId, mContext.getOpPackageName());            } catch (RemoteException e) {                Log.v(TAG, "Remote exception in isFingerprintHardwareDetected(): ", e);            }        } else {            Log.w(TAG, "isFingerprintHardwareDetected(): Service not connected!");        }        return false;    }

  指纹服务的管理类,提供接口给APP调用;本身通过binder远程调用后台服务。

3、IFingerprintService.aidl

boolean isHardwareDetected(long deviceId, String opPackageName);

  此函数为声明的接口,具体实现在子类FingerprintServiceWrapper 中。

4、FingerprintService.java

4.1 继承关系

 private final class FingerprintServiceWrapper extends IFingerprintService.Stub {............}

  FingerprintService的内部类FingerprintServiceWrapper 继承IFingerprintService.Stub

4.2 isHardwareDetected()

public boolean isHardwareDetected(long deviceId, String opPackageName) {            if (!canUseFingerprint(opPackageName, false /* foregroundOnly */)) {                return false;            }            return mHalDeviceId != 0;        }

  如果没有编译fingerprintd或者fingerprintd没有成功初始化;mHalDeviceId就无法赋值,此时没有指纹选项;若mHalDeviceId 不等于零则表示硬件支持,显示指纹选项

  下一篇将继续往下分析mHalDeviceId的初始化;未完待续。。。