Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

236
Views
JS interface doesn't work with Android Kotlin

I am trying to implement JS interface in my WebView. I created a separate class with a method which calls listener, subsequently the string caught by listener should be put in the intent (in MainActivity) and intent finishes. MainActivity.kt:

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.webkit.JavascriptInterface
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
import sbs.pros.app.databinding.ActivityMainBinding

typealias IDListener = (qr: String) -> Unit

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val answerIntent = Intent()
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    binding = ActivityPayBinding.inflate(layoutInflater)

    val WebView = binding.webView

    val webSettings: WebSettings = WebView.settings

    WebView.settings.javaScriptEnabled = true
    WebView.settings.javaScriptCanOpenWindowsAutomatically = true

    webSettings.builtInZoomControls = false

    WebView.webViewClient = WebViewClient()
    WebView.webChromeClient = WebChromeClient()
    WebView.addJavascriptInterface(WebAppInterface(this
    ) { id ->
        answerIntent.putExtra("pay", id)
        setResult(RESULT_OK)
        finish()
    }, "AndroidInterface")

    WebView.setInitialScale(160)
    WebView.loadUrl("https://pros.sbs/payment/create_payment.php?apicall=one_address")
    setContentView(binding.root)
}
}

class WebAppInterface internal constructor(c: Context, listener: IDListener) {
    var mContext: Context = c
    fun WebAppInterface(context: Context) {
        this.mContext = context
    }

    @JavascriptInterface
    @SuppressWarnings("unused")
    fun getID(id: String?, listener: IDListener) {
        if (id != null) {
            listener(id)
        }
    }
}

create_payment.php:

<script src="javascript.js">
        function giveID(id) {
                AndroidInterface.getID(id);
            }
</script>
<?php
if(null !==filter_input(INPUT_GET, 'apicall')){
    switch(filter_input(INPUT_GET, 'apicall')){
    case 'one_address':
    ?>
    <script src="javascript.js">
        giveID('some_id');
    </script>
    <?php
    break;
}
}

The intent then should finish, showing a result (String) in a separate TextView. Unfortunately, that does not happen and the result returned is null. Please help me to find the problem with the interface.

about 4 years ago · Juan Pablo Isaza
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!