Android Служба автозаполнения не отображается в определенных приложениях - PullRequest
0 голосов
/ 16 апреля 2020

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

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...