Android Autofill 仅适用于来自 onFillRequest 而不是来自身份验证活动的响应

Posted

技术标签:

【中文标题】Android Autofill 仅适用于来自 onFillRequest 而不是来自身份验证活动的响应【英文标题】:Android Autofill only working with response from onFillRequest but not from Authentication Activity 【发布时间】:2018-06-11 19:58:31 【问题描述】:

我为我的密码管理器应用实现了android Autofill Service。用户报告了 Paypal app 的问题,该服务似乎无法正常工作。

我对此进行了调查,发现onFillRequest 中的以下代码(Xamarin)确实有效:(“有效”表示单击自动填充弹出窗口后字段已填充)

var responseBuilder = new FillResponse.Builder();
var autofillIds = FindAutoFillIds(); //gets the autofill ids for each EditText
RemoteViews presentation = AutofillHelper.NewRemoteViews(PackageName, "fill data from onFillRequest", AppNames.LauncherIcon);
var datasetBuilder = new Dataset.Builder(presentation);

foreach (AutofillId autofillId in autofillIds)

    datasetBuilder.SetValue(autofillId, AutofillValue.ForText("some data"));


responseBuilder.AddDataset(datasetBuilder.Build());

callback.OnSuccess(responseBuilder.Build());

它基本上使用单个数据集创建填充响应,该数据集为每个自动填充字段设置值。

现在我需要添加一个身份验证活动:

var responseBuilder = new FillResponse.Builder();
var autofillIds = FindAutoFillIds(); //gets the autofill ids for each EditText

Intent intent = new Intent(this, typeof(MyAuthActivity));   
var sender = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.CancelCurrent).IntentSender;
RemoteViews presentation = AutofillHelper.NewRemoteViews(PackageName, "fill data after auth", AppNames.LauncherIcon);

var datasetBuilder = new Dataset.Builder(presentation);
//Main difference here:
datasetBuilder.SetAuthentication(sender);

foreach (AutofillId autofillId in autofillIds)

    datasetBuilder.SetValue(autofillId, AutofillValue.ForText("some placeholder data"));


responseBuilder.AddDataset(datasetBuilder.Build());

callback.OnSuccess(responseBuilder.Build());

MyAuthActivity.OnCreate 是这样的:

RemoteViews presentation = AutofillHelper.NewRemoteViews(PackageName, "dataset from auth activity", AppNames.LauncherIcon);

var datasetBuilder = new Dataset.Builder(presentation);
var autofillIds = GetAutofillIds(...); //returns the same autofillIds as in the onFillRequest

foreach (AutofillId autofillId in autofillIds)

    datasetBuilder.SetValue(autofillId, AutofillValue.ForText("some other data"));

var ReplyIntent = new Intent();

bool returnDataset = true; //tried both true and false, neither works
if (returnDataset)

    ReplyIntent.PutExtra(AutofillManager.ExtraAuthenticationResult, datasetBuilder.Build());

else

    var responseBuilder = new FillResponse.Builder();
    responseBuilder.AddDataset(datasetBuilder.Build());
    ReplyIntent.PutExtra(AutofillManager.ExtraAuthenticationResult, responseBuilder.Build());


SetResult(Result.Ok, ReplyIntent);
Finish();

这基本上是使用相同的自动填充 ID 创建另一个数据集,但是使用 FillResponse 和 Dataset 响应返回它们都不起作用:目标应用程序上的输入字段保持为空。

我注意到Bitwarden 的自动填充服务实现中出现了相同的行为。

我的问题是:身份验证活动的代码有什么问题吗?或者这是否表明 Paypal 的应用程序存在问题?我可以做些什么来进一步调试它?

【问题讨论】:

【参考方案1】:

这是一个已知的 WebView issue,已在 Chrome M64 上修复。

您可以通过安装较新的 Chrome 并通过设置 -> 开发人员选项更改默认 WebView 实现来验证它是否已修复。

【讨论】:

使用 Chrome beta (64.0.3282.29) 我仍然看到相同的结果。我还需要做什么吗? 不,它应该可以工作。老实说,我自己没有尝试过修复,所以我在 Chromium 问题上添加了评论。 其实我觉得只固定在M65上;我使用 Chrome Beta (64.0.3282.85) 和我的服务 (github.com/the-felipeal/android-AutofillFramework) 进行了尝试,但仍然失败。然后我切换到 Canary (65.0.3322.0),它起作用了。

以上是关于Android Autofill 仅适用于来自 onFillRequest 而不是来自身份验证活动的响应的主要内容,如果未能解决你的问题,请参考以下文章

测试表单仅适用于来自本地机器的请求

Android - spotShadowAlpha 仅适用于线性布局

仅适用于 Android 6 的安全异常

仅适用于 Android 6 的安全异常

来自 JBoss - RedHat codeready 的基于 Eclipse 的图形 Camel 编辑器是不是仅适用于 xml 中的骆驼?

色带仅适用于 Android 4.0+