代码之家  ›  专栏  ›  技术社区  ›  Jibran.

WebView中的javascriptinterface在棒棒糖和棉花糖上不被调用

  •  0
  • Jibran.  · 技术社区  · 6 年前

    我在android 7.0上试过,它可以用,但在android 5.6上,它不能用,我找不到任何可能出错的线索。 URL重定向到支付门户网站,最终它从javascript调用android.postmessage(“成功”),但在本机中没有被调用这个问题只在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()
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Jibran.    6 年前

    这是来自web的javascript脚本的问题,它在我的接口函数被调用之前在web视图中运行的脚本中抛出了一个错误,但是奇怪的行为是,脚本只在android 5,6上终止,而android 7 web视图不终止执行并执行关于错误的整个脚本,这就是为什么接口fuNCTION在安卓7中被呼叫。