【问题标题】:Allow to disable Oreo Autofill service for a package允许为包裹禁用 Oreo 自动填充服务
【发布时间】:2019-05-17 14:48:57
【问题描述】:

我是密码管理器应用程序的开发人员,该应用程序提供 Android 自动填充服务 (Android 8+)。 一些用户要求应该可以在每个目标应用程序的基础上禁用此服务。在自动填充服务的 onFillRequest 中,我添加了一个带有“禁用 [包名称] 的自动填充”的“数据集”,如下所示:

var sender = IntentBuilder.GetDisableIntentSenderForResponse(this, query, isManual, isForDisable);

RemoteViews presentation = AutofillHelper.NewRemoteViews(PackageName,
    GetString(Resource.String.autofill_disable , new Java.Lang.Object[] { query}), Resource.Drawable.ic_menu_close_grey);

var datasetBuilder = new Dataset.Builder(presentation);
datasetBuilder.SetAuthentication(sender);

foreach (var autofillId in autofillIds)
{
    datasetBuilder.SetValue(autofillId, AutofillValue.ForText("PLACEHOLDER"));
}

responseBuilder.AddDataset(datasetBuilder.Build());

当用户单击“禁用数据集”时,将启动一个活动,该活动存储应禁用自动填充的包,然后立即自行完成。

我的问题:我应该从该活动返回什么作为回复,以表明自动填充从现在开始应该是不可见的?

我现在在做

bool isManual = Intent.GetBooleanExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, false);

Intent reply = new Intent();
FillResponse.Builder builder = new FillResponse.Builder();
AssistStructure structure = (AssistStructure)Intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure);
StructureParser parser = new StructureParser(this, structure);
try
{
    parser.ParseForFill(isManual);

}
catch (Java.Lang.SecurityException e)
{
    Log.Warn(CommonUtil.Tag, "Security exception handling request");
    SetResult(Result.Canceled);
    return;
}

AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;


var autofillIds = autofillFields.GetAutofillIds();
builder.SetIgnoredIds(autofillIds);
Bundle state = new Bundle();
state.PutStringArray("AutoFillDisabledQueries", disabledValues.ToArray());

builder.SetClientState(state);
try
{
    var response = builder.Build();
    reply.PutExtra(AutofillManager.ExtraAuthenticationResult, response);
}
catch (Exception e)
{
    Kp2aLog.LogUnexpectedError(e);
    throw;
}

SetResult(Result.Ok, reply);

但是

1.) 自动填充提示不会消失

2.) 如果我再次点击禁用,目标应用程序将被强制关闭(详情请参阅消息末尾)

所以这显然不是要走的路...有什么想法吗?非常感谢!


关于上面的第2点,我在logcat中看到了以下内容:

12-17 09:48:31.865  Google Pixel    Error   11711   AndroidRuntime  java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:autoFillAuth:, request=16121857, result=-1, data=Intent { (has extras) }} to activity {com.sonelli.juicessh/com.sonelli.juicessh.activities.ManageConnectionActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4361)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4403)
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6680)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

【问题讨论】:

    标签: android autofill android-autofill-manager


    【解决方案1】:

    setIgnoredIds() 应该用于不可自动填充的字段(例如,如果屏幕有用户名、密码和验证码字段,您可以使用忽略后者)。

    如果你想禁用活动的自动填充,你需要返回一个Fillresponse,只设置[disableAutofill()][1]。请注意,重新启动后禁用它不会持续存在,因此您应该在内部跟踪它,并在活动再次触发自动填充时调用该 API。

    【讨论】:

    • 还要注意这个 API 是在 Pie 上引入的;对于 Oreo,您必须在身份验证捆绑响应中返回一个不触发自动填充或保存的 FillResponse(例如,它可能只有一个 SaveInfo 对象,具有不可编辑的自动填充 ID),然后在进一步调用时(从那个相同的应用程序/包),您将返回 null FillResponse。
    • 感谢您的回复。我想有一个奥利奥的解决方案,所以谢谢你的评论。不幸的是,我不明白“使用不可编辑的自动填充”是什么意思——我应该从哪里得到这些?
    • P 的解决方案只是为了优化,即一旦您创建了一个禁用它的 FillResponse,该活动/包将不会再次触发自动填充(除非重新启动设备)。要为当前请求禁用自动填充,只需返回 null FillResponse。我认为这不适用于身份验证响应,但确实如此(参见 [code][1])[1]:android.googlesource.com/platform/frameworks/base/+/…
    猜你喜欢
    • 2020-09-22
    • 2018-12-23
    • 1970-01-01
    • 2018-03-30
    • 2018-01-25
    • 2023-03-25
    • 2019-04-10
    • 2013-03-22
    相关资源
    最近更新 更多