gpt4 book ai didi

安卓奥利奥 : what should I do to publish my app as an Autofill service provider?

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:01 24 4
gpt4 key购买 nike

我是密码管理器应用的独立开发者。我应该怎么做,或者我应该实现什么(接口(interface)/API/服务),使我的应用程序成为自动填充服务提供商(在 Android Oreo API >= 26 的设备中)?

我看了各种相关的文档,但是就是看不懂怎么弄。我错过了什么吗?

目前我看到只有知名的密码管理器支持这个功能:

Image of apps that provide Autofill service

欢迎任何提示。

最佳答案

像往常一样,谷歌自己的examples repository provides a good starting point用于学习 Autofill Framework 的 API,并且涵盖的 Material 比我能放入答案的 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);
}

正如我们所见,自动填充 API 需要大量代码才能为 View 提供单个静态自动填充建议。我们已经提前知道了——这个例子假设viewNode是我们要为其提供自动填充建议的文本输入字段。实际上,这个例子太简单了,但我想清楚地展示最小实现。对于每个 WindowNode ,我们需要遍历根的 View 树 ViewNode 及其每个 child 找到我们的服务希望为其提供自动填充数据的每个输入字段,然后创建一个 RemoteViews Dataset 其中包含我们将添加到 FillResponse 的每个字段的自动填充建议使用 FillResponse.Builder.addDataset() .此示例未显示 R.layout.autofill_suggestion 的纯 XML 布局TextView用于为 RemoteViews 创建建议显示项.

同样,Android调用onSaveRequest()当用户想要将数据保存在 Activity 的字段中以供将来完成请求并注入(inject) SaveRequest 时我们的服务使用它来查找要记住的自动填充数据。

这些方法中的每一个的具体实现将取决于我们的应用程序提供的自动填充数据的类型。自动填充服务必须认真检查每个字段的特征并仔细选择一组适当的自动填充建议以避免将用户数据泄露给恶意客户端 Activity (参见评论)。特别是对于密码管理器,我们需要特别注意正确验证服务的用户并在请求和保存自动填充数据时提供一组安全的建议。

我们现在可以 register the service<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>

如图所示,这会将我们的自动填充服务绑定(bind)为出现在问题中显示的自动填充服务列表中的可用选项。 android:name属性必须匹配我们的名称 AutofillService类,我们的应用程序必须声明 BIND_AUTOFILL_SERVICE允许。更改 android:label 的值为该服务取一个合适的名称(例如,“Autofill with Password Manager”)。或者,在字符串资源中设置它。另请注意,我们应该提供一个“设置” 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com