簡體   English   中英

允許禁用軟件包的Oreo自動填充服務

[英]Allow to disable Oreo Autofill service for a package

我是密碼管理器應用程序的開發人員,該應用程序提供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)

setIgnoredIds()應該用於不可自動填充的字段(例如,如果屏幕具有用戶名,密碼和驗證碼字段,則可以忽略后者)。

如果要為活動禁用自動填充,則需要返回僅在其上設置了[disableAutofill()][1]Fillresponse 請注意,禁用它不會在重新啟動后持續存在,因此您應該在內部對其進行跟蹤,如果該活動再次觸發自動填充,則調用該API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM