WebView 中的 JavaScriptInterface 不会在 Lollipop 和 Marshmallow 上调用
JavaScriptInterface in a WebView is not called on Lollipop and Marshmallow
我已经在 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()
}
}
这是来自 Web 的 JavaScript 脚本的问题,它在我的接口函数被调用之前就在 Web 视图中的脚本 运行 中引发了错误,但奇怪的行为是仅该脚本在 Android 5,6 时终止,而 Android 7 Web 视图不会终止执行并执行有关错误的整个脚本,这就是在 Android 7.[=10= 中调用接口函数的原因]
我已经在 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()
}
}
这是来自 Web 的 JavaScript 脚本的问题,它在我的接口函数被调用之前就在 Web 视图中的脚本 运行 中引发了错误,但奇怪的行为是仅该脚本在 Android 5,6 时终止,而 Android 7 Web 视图不会终止执行并执行有关错误的整个脚本,这就是在 Android 7.[=10= 中调用接口函数的原因]