我是密码管理器应用程序的独立开发人员。我应该做什么,或者我应该实现什么(接口(interface)/API/服务),以使我的应用程序成为自动填充服务提供者(在 Android Oreo API >= 26 的设备中)?
我已经阅读了各种相关文档,但我不明白如何做到这一点。我错过了什么吗?
目前我看到只有知名的密码管理器支持这个功能:
欢迎任何提示。
像往常一样,谷歌自己的examples repository provides a good starting point用于学习自动填充框架的 API,并且涵盖的 Material 比我能回答的要多得多。以下是关键概念的概述。来自 documentation 中的描述,我们想创建一个自动填充服务来处理来自其他应用程序(客户端)的请求,以存储和检索自动填充字段数据。
首先,我们需要创建一个服务提供者类来履行这个契约。我们可以扩展基础 AutofillService
class :
import android.service.autofill.AutofillService;
...
public class MyAutofillService extends AutofillService {
...
@Override
public void onFillRequest(FillRequest request, CancellationSignal cancellationSignal,
FillCallback callback) { ... }
@Override
public void onSaveRequest(SaveRequest request, SaveCallback callback) { ... }
}
onFillRequest()
和 onSaveRequest()
方法对于我们的理解是最重要的。 Android系统调用onFillRequest()
确定我们的服务是否可以自动填充特定 Activity 的字段,并为方法提供 FillRequest
其中包含我们的服务将检查可填写字段的上下文和 View 信息。当服务完成时,它会调用提供的 callback
使用适当的自动填充数据。FillRequest
提供自动填充建议所需的基本步骤的显着简化概述。 :@Override
public void onFillRequest(FillRequest request, CancellationSignal signal, FillCallback callback) {
List<FillContext> contexts = request.getFillContexts();
AssistStructure structure = contexts.get(contexts.size() - 1);
WindowNode windowNode = structure.getWindowNodeAt(0);
ViewNode viewNode = windowNode.getRootViewNode(); // pretend this is an EditText
String suggestionText = "This will appear in the autofill list for 'viewNode'.";
RemoteViews suggestion = new RemoteViews(getPackageName(), R.layout.autofill_suggestion);
suggestion.setTextViewText(R.id.autofill_suggestion, suggestionText);
Dataset suggestionDataset = new Dataset.Builder(suggestion)
.setValue(viewNode.getAutoFillId(), AutofillValue.forText(suggestionText))
.build();
FillResponse response = new FillResponse.Builder()
.addDataset(suggestionDataset)
.build();
callback.onSuccess(response);
}
View
提供单个静态自动填充建议。我们已经提前知道——示例假设 viewNode
是我们要为其提供自动填充建议的文本输入字段。实际上,这个例子太简单了,但我想清楚地展示最小的实现。对于每个 WindowNode
,我们需要遍历根 ViewNode
的 View 树及其每个 child 找到我们的服务希望为其提供自动填充数据的每个输入字段,然后创建一个 RemoteViews
和 Dataset
包含我们将添加到 FillResponse
的每个字段的自动填充建议使用 FillResponse.Builder.addDataset()
.此示例未显示 R.layout.autofill_suggestion
的纯 XML 布局。 TextView
用于为 RemoteViews
创建建议显示项.onSaveRequest()
当用户想要将数据保存在 Activity 的字段中以供将来完成请求并注入(inject) SaveRequest
我们的服务用来查找要记住的自动填充数据。<application>
项目的 AndroidManifest.xml block :<service
android:name=".MyAutofillService"
android:label="Multi-Dataset Autofill Service"
android:permission="android.permission.BIND_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>
android:name
属性必须与我们的 AutofillService
的名称匹配类,我们的应用程序必须声明 BIND_AUTOFILL_SERVICE
允许。更改 android:label
的值为服务指定一个合适的名称(例如,“使用密码管理器自动填充”)。或者,将其设置在字符串资源中。还要注意,我们应该提供一个“设置” Activity 来配置我们在 <meta‑data>
中指定的服务。对于 android.autofill
:<autofill-service android:settingsActivity="foo.bar.SettingsActivity" />
ACTION_REQUEST_SET_AUTOFILL_SERVICE
在设置或首次启动期间 Intent 帮助用户找到此屏幕。
关于安卓奥利奥 : what should I do to publish my app as an Autofill service provider?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47367576/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://www.ogeek.cn/) | Powered by Discuz! X3.4 |