文/arjinmc
本文是基于官方demo来分析Autofill Framework的用法(要正常打开这个项目请使用Android Studio Preview 3.0以上版本,并下载Anroid O模拟器镜像)。Autofill Framework最低支持SDK API 26(Android O)+。
在手机中管理autofill服务:
设置->系统->语言与输入->高级->自动填写服务->选择自己想要的服务,点击它旁边的设置按钮可以进入这个autofill的设置界面(如果有给此服务设定了设置界面)
也就是:
setting->system->languages & input -> advanced -> autofill services
在layout中通过autofillHints标记需要记录的控件节点
通过属性autofillHints在标记需要记录的节点,也就是key-value的形式的key。
例如:标记记录密码框key为password
<EditText
android:id="@+id/passwordField"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:autofillHints="password"
android:inputType="textPassword" />
在代码中可以通过view.setAutofillHints(String… autofillHints) 方法来设置这些标记。
autofillHints的值都是View类(api 26版本)中定义的一些String类型常量,目前有13种,分别是:
- AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE 信用卡到期日期
- AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY 信用卡到期日
- AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH 信用卡到期月
- AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR 信用卡到期年
- AUTOFILL_HINT_CREDIT_CARD_NUMBER 信用卡卡号
- AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE 信用卡安全密码
- AUTOFILL_HINT_EMAIL_ADDRESS 邮箱地址
- AUTOFILL_HINT_NAME 用户真名
- AUTOFILL_HINT_PASSWORD 用户密码
- AUTOFILL_HINT_PHONE 电话号码
- AUTOFILL_HINT_POSTAL_ADDRESS 邮寄地址
- AUTOFILL_HINT_POSTAL_CODE 邮寄编号
- AUTOFILL_HINT_USERNAME 用户名
view.setImportantForAutofill(int mode)
设置autofill的重要级别也是一些常量,对应xml的标签是android:importantForAutofill,有5种模式:
- IMPORTANT_FOR_AUTOFILL_AUTO 不管是否重要,都使用autofill
- IMPORTANT_FOR_AUTOFILL_NO 不使用autofill,但是子view可以使用
- IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS 不使用autofill,子view也不使用
- IMPORTANT_FOR_AUTOFILL_YES 使用autofill,包括子view
- IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS 使用autofill,但子view不使用
AutofillService
1.创建自定义AutofileService,继承AutofillService
重写两个方法:
- onSaveRequest(SaveRequest request, SaveCallback callback)
保存需要自动填入记录。
List<FillContext> context = request.getFillContexts();
//保存步骤:
//1.得到最近一条需要填写的表单(表单的所有内容)
AssistStructure structure = context.get(context.size() - 1).getStructure();
//2.解析记录的数据AssistStructure
//3.通过SharedPreferences,数据库,文件等存储方式保存下来
- onFillRequest(FillRequest request, CancellationSignal cancellationSignal,
FillCallback callback)
执行自动填入记录。
//自动填写步骤:
//1.得到最近一条需要填写的表单(表单的所有内容)
AssistStructure structure = request.getFillContexts()
.get(request.getFillContexts().size() - 1).getStructure();
//2.获取保存的自动填写的表单的结果集Dataset放在FillResponse上
//3.通过FillCallback把FillResponse的内容展示到界面交互
在manifest中,声明AutofillService
<service
<!-- 自己定义的autofillservie类名 -->
android:name=".multidatasetservice.MyAutofillService"
<!-- 申明权限 -->
android:permission="android.permission.BIND_AUTOFILL"
<!-- autofill的名字,随意设定,最终会显示在系统设置的autofill service上-->
android:label="Multi-Dataset Autofill Service">
<meta-data
android:name="android.autofill"
android:resource="@xml/multidataset_service" />
<intent-filter>
<action android:name="android.service.autofill.AutofillService" />
</intent-filter>
</service>
2.获取表单节点并解析AssistStructure
//从AssistStructure获取view的节点
private void parse(){}
int nodes = mStructure.getWindowNodeCount();
for (int i = 0; i < no