Android Autofill 仅处理来自 onFillRequest 的响应,而不处理来自 Authentication Activity 的响应

标签 android xamarin paypal autofill android-autofill-manager

我已经实现了一个 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());

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

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

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 中出现了相同的行为的自动填充服务的实现。

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

最佳答案

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

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

关于Android Autofill 仅处理来自 onFillRequest 的响应,而不处理来自 Authentication Activity 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48055432/

相关文章:

android - 软键盘出现时向上移动布局

c# - 字符串填充不占用相同的字符间距

php - header 显示在 apache 错误日志中(curl 和 paypal)

c# - 在 Paypal 摘要中添加换行符

php - paypal结帐后无法清除购物车Opencart 2.0.3.1

android - 我们如何以编程方式检查 android 手机是否支持外部 SD 卡?

java - 由于 IllegalState 异常,Android TestRunner 失败

android - 我如何在我的应用程序中获取特定 URL 的推特提要?

string - 如何在 UI 标签中将字符串的一部分设为粗体

c# - 将 FusedLocationApi 与 Xamarin 3 结合使用