Android自动填充服务未在某些应用程序中显示弹出窗口

3
我正在尝试通过按照这个教程实现我的应用程序的自动填充服务。它在某些应用程序上工作正常,因此我可以在登录页面的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())' 也会被调用。

感谢您的帮助!

1个回答

0
<service
        android:name=".MyAutofillService"
        android:exported="true"
        android:label="Custom Autofill Service"
        android:permission="android.permission.BIND_AUTOFILL_SERVICE">
        <intent-filter>
            <action android:name="android.service.autofill.AutofillService" />
        </intent-filter>
        <meta-data
            android:name="android.autofill"
            android:resource="@xml/service_configuration" />
    </service> use this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接