我正在尝试通过按照这个教程实现我的应用程序的自动填充服务。它在某些应用程序上工作正常,因此我可以在登录页面的EditText下看到弹出窗口,但在某些应用程序中它没有显示出来。我已经尝试使用其他应用程序,如Bitwarden和1Password,它们可以让它正常工作。
这是我的代码:
这是我的代码:
val emailFields = arrayListOf<AssistStructure.ViewNode>()
override fun onFillRequest(
request: FillRequest,
cancellationSignal: CancellationSignal,
callback: FillCallback
) {
val context: List<FillContext> = request.fillContexts
val structure: AssistStructure = context[context.size - 1].structure
val emailNode = structure.getWindowNodeAt(0).rootViewNode
checkForUsernameField(emailNode)
if (emailFields.size > 0) {
val field = emailFields[0];
val responseBuilder = FillResponse.Builder()
val authIntent = Intent(this, AuthenticateActivity::class.java).apply {
putExtra("emailId", field.autofillId)
}
val intentSender: IntentSender = PendingIntent.getActivity(
this,
1001,
authIntent,
PendingIntent.FLAG_CANCEL_CURRENT
).intentSender
val usernamePresentation = RemoteViews(packageName, R.layout.autofill_layout)
val datasetBuilder = Dataset.Builder(usernamePresentation)
datasetBuilder.setAuthentication(intentSender)
datasetBuilder.setValue(field.autofillId!!, AutofillValue.forText("email"));
responseBuilder.addDataset(datasetBuilder.build())
callback.onSuccess(responseBuilder.build())
}
}
private fun checkForUsernameField(emailNode: AssistStructure.ViewNode) {
for (i in 0 until emailNode.childCount) {
if (emailNode.getChildAt(i).className != null) {
if (emailNode.getChildAt(i).className.contains("EditText")) {
val viewId = emailNode.idEntry
if (viewId != null
&& (viewId.contains("email")
|| viewId.contains("username")
|| viewId.contains("login")
|| viewId.contains("user")
|| viewId.contains("user")
|| viewId.contains("usr")
|| viewId.contains("user name")
|| viewId.contains("identifier")
|| viewId.contains("id"))) {
emailFields.add(emailNode.getChildAt(i))
return
}
} else {
checkForUsernameField(emailNode.getChildAt(i))
}
}
}
}
奇怪的是,即使弹出框没有显示,'callback.onSuccess(responseBuilder.build())' 也会被调用。
感谢您的帮助!