Android Autofill服务setAuthentication失效及提示框闪烁问题咨询
问题根因与修复方案
核心错误点
- 你同时添加了空值Dataset和FillResponse级别的认证,是导致Presentation闪烁的直接原因
- 你将
setAuthentication设置在FillResponse层级,且认证通过后返回了FillResponse,这是浏览器场景失效的核心原因,Chrome等浏览器对FillResponse级认证兼容性极差,行业通用实现都是将认证绑定到Dataset层级。
疑问解答
setAuthentication应该设置在Dataset上,而非FillResponse上- 验证通过后Activity应该返回Dataset,而非FillResponse
具体修复步骤
1. 移除无用的空Dataset,修复Presentation闪烁
你当前创建的Dataset所有值都为null,系统会优先尝试展示这个空Dataset,又因为无有效填充内容快速隐藏,就会出现闪烁现象,直接删除FillResponse.Builder中的addDataset(dataSet.build())调用即可。
2. 将认证绑定到Dataset层级,兼容浏览器场景
修改onFillRequest中的FillResponse构造逻辑,创建带认证的Dataset:
val manualPresentation = createPresentation("Select password") val intent = Intent(applicationContext, AutofillActivity::class.java) // 注意Android12+需要加FLAG_MUTABLE,否则PendingIntent会抛出异常 val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_MUTABLE } else { PendingIntent.FLAG_CANCEL_CURRENT } val sender = PendingIntent.getActivity( applicationContext, id, intent, flag ).intentSender // 构建带认证的Dataset val authDataset = Dataset.Builder(manualPresentation) .setAuthentication(sender) .setValue(passwordParsedAssistStructure.id, null) .setValue(usernameParsedAssistStructure.id, null) .build() return FillResponse.Builder() .addDataset(authDataset) .build()
3. 修改自定义Activity的返回逻辑,返回Dataset而非FillResponse
val returnDataset = Dataset.Builder() .setValue( passwordId, AutofillValue.forText(String(password)) ) .setValue( userId, AutofillValue.forText(username) ) .build() val replyIntent = Intent().apply { // EXTRA_AUTHENTICATION_RESULT传入Dataset实例即可 putExtra(EXTRA_AUTHENTICATION_RESULT, returnDataset) } setResult(Activity.RESULT_OK, replyIntent) finish()
内容的提问来源于stack exchange,提问作者falsetto
相关产品推荐
相关产品推荐

