В настоящее время я пытаюсь внедрить службу автозаполнения для моего приложения, следуя этому руководству . Он работает в определенном приложении, поэтому я вижу всплывающее окно под 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 ()) 'вызывается, даже если всплывающее окно не показывает' t show.
Спасибо за помощь!