【问题标题】:JavaScriptInterface in a WebView is not called on Lollipop and Marshmallow在 Lollipop 和 Marshmallow 上不调用 WebView 中的 JavaScriptInterface
【发布时间】:2019-01-26 12:09:36
【问题描述】:

我已经在 android 7.0 上尝试过,它可以工作,但在 android 5,6 上它不起作用,我找不到任何可能出错的线索。 URL 重定向到支付门户,最后它从 Javascript 调用 Android.postMessage("success"),但它不会在本机中被调用,这个问题只在 android 5 中持续存在,也许在 android 6 上也存在。

我的最低 SDK 级别是 21。

class PaymentActivity : BaseActivity<ActivityPaymentBinding, IPaymentMvvm.ViewModel>(), IPaymentMvvm.View {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activityComponent.inject(this)
        setAndBindContentView(savedInstanceState, R.layout.activity_payment)
        viewModel.initVM()
        binding.web.webViewClient = Web(viewModel)
        binding.web.settings.javaScriptEnabled = true
        binding.web.settings.loadWithOverviewMode = true
        binding.web.settings.useWideViewPort = true
        binding.web.addJavascriptInterface(JSBridge(this, this), "Android")


        val url = intent.extras.getString("url")
        if (url == null)
            finish()

   binding.web.loadUrl(url)




    }

    override fun onOptionsItemSelected(menuItem: MenuItem): Boolean {

        when (menuItem.itemId) {
            android.R.id.home ->
                finish()

        }
        return super.onOptionsItemSelected(menuItem)
    }

    class Web(val viewModel: IPaymentMvvm.ViewModel) : WebViewClient() {
        init {
            viewModel.setProgress(true)
        }

        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {

            view?.loadUrl(request?.url.toString())

            return true
        }

        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            viewModel.setProgress(false)
        }

        override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) {
            super.onReceivedError(view, request, error)
            viewModel.setProgress(false)
            Timber.e(error.toString())
        }
    }
}


class JSBridge(val context: Context, val activity: Activity) {
    @JavascriptInterface
    fun postMessage(message: String) {
        // here we return true if we handled the post.
        Timber.i(message)
        context.toast(message)

        val intent = Intent(context, OrderThanksActivity::class.java)
        intent.putExtra(Enums.contactDetail.contactNumber.name, activity.intent.getStringExtra(Enums.contactDetail.contactNumber.name))
        intent.putExtra(Enums.contactDetail.phoneNumber.name, activity.intent.getStringExtra(Enums.contactDetail.phoneNumber.name))
        intent.putExtra(Enums.contactDetail.cellNumber.name, activity.intent.getStringExtra(Enums.contactDetail.cellNumber.name))
        activity.startActivity(intent)
        activity.finish()
    }
}

【问题讨论】:

    标签: android android-webview backwards-compatibility


    【解决方案1】:

    这是来自 web 的 JavaScript 脚本的问题,它在我的界面函数甚至被调用之前在 web 视图中运行的脚本中引发了错误,但奇怪的行为是该脚本仅在 Android 5,6 上终止,而 Android 7 Web 视图不会终止执行并执行有关错误的整个脚本,这就是在 Android 7 中调用接口函数的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 2016-06-20
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多