废话没有好吧 我们直接上代码以下是 .xml 与 .kt文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.main.board.MatchBoardFragment">
<WebView
android:id="@+id/textMatchBoard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="50dp"
android:layout_marginEnd="8dp"
android:textAlignment="center">
</WebView>
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="50dp"
android:layout_marginEnd="8dp"
android:textAlignment="center">
</WebView>
<com.hjq.bar.TitleBar
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</FrameLayout>
class UrlActivity : MyActivity<ActivityUrlBinding>() {
private val profileViewModel: ProfileViewModel by viewModels()
private var token : String? = null
var _value : Int = 0
var _valueName: String? = null
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK && binding.textMatchBoard.canGoBack()) {
binding.textMatchBoard.goBack()
binding.textMatchBoard.removeAllViews()
return true
}
return super.onKeyDown(keyCode, event)
}
override fun onBackPressed() {
if (binding.textMatchBoard.canGoBack()){
binding.textMatchBoard.goBack()
binding.textMatchBoard.removeAllViews()
}else {
super.onBackPressed()
}
}
override fun initBind() {
binding = ActivityUrlBinding.inflate(inflater)
}
private var webview : WebView? = null
@SuppressLint("SetJavaScriptEnabled", "LogNotTimber")
override fun initView() {
/**
*
* Intent传值与if判断可以直接忽略
* */
val _intent = intent;
//从Intent当中根据key取得value
if (_intent != null) {
_value = _intent.getIntExtra("赛事Id",0);
_valueName = _intent.getStringExtra("赛事Name")
}
if (_value == 0){
return
}
webview = binding.webView
webview?.settings?.javaScriptEnabled = true
webview?.settings?.domStorageEnabled = true
webview?.webChromeClient = WebChromeClient()
//该方法支持支付宝和微信支付
webview?.setWebViewClient(object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (url?.startsWith("http:") == true || url?.startsWith("https:") == true) {
return false;
}
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
});
val mWebView: WebView = binding.textMatchBoard
binding.title.title = "$_valueName"
//Token的观察者
profileViewModel.authTokenLiveData.observe(this) {
token = it
mWebView.webChromeClient = WebChromeClient()
mWebView.settings.javaScriptEnabled = true
mWebView.settings.domStorageEnabled = true
mWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
if (url.startsWith("alipays:") || url.startsWith("alipay")) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
// 如下方案可在非微信内部WebView的H5页面中调出微信支付
if (url.startsWith("weixin://wap/pay?")) {
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse(url)
startActivity(intent)
return true
} else {
val extraHeaders: MutableMap<String, String> = HashMap()
extraHeaders["Referer"] = "https://xxxx.xxxxxx.com"
webview?.loadUrl(url, extraHeaders)
}
return true
}
override fun onReceivedSslError(
view: WebView,
handler: SslErrorHandler,
error: SslError
) { // 重写此方法可以让webview处理https请求
handler.proceed()
}
}
if (token != null) {
//测试版本链接
if (CustomApp.sInstance.DEBUG_MODE) {
mWebView.loadUrl(
"https://xxxx.xxxxxx.com/" +
"xxxxxxxxxx" +
"&id=$_value" +
"&token=$token")
}else{
//正式版本链接
mWebView.loadUrl(
"https://xxxx.xxxxxx.com/" +
"xxxxxxxxxx" +
"&id=$_value" +
"&token=$token")
}
}
}
}
}
2.加载H5
第一次搞安卓html5加载,然后我们开始调用微信支付, 那我们就开始分析下我的代码
首先 我们要加载一个网络的H5页面 我认为这是通用也是必用的方法如下:
webView.loadUrl("http://www.xxx.com/")
webView = WebChromeClient()
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.webViewClient =WebViewClient()
一个简单的H5页面页面显示就加载好了
下面这个是页面js加载出错的方法
3.调起微信支付与错误解决[(84条消息) Android webview解决JS报错chromium: INFO:CONSOLE(1)] "Uncaught
TypeError: Cannot read property
‘getItem’_codekxx的博客-CSDN博客
接下来就是微信支付了 推荐先看微信开发平台的开发官网
微信的调起与报错的方法如下 😗
我搜了相关的文章一下参考的以下几个
(84条消息)
android中WebView调用H5页面的支付宝、微信支付失败错误返回ERR_UNKNOWN_URL_SCHEME_吕氏春秋i的博客-CSDN博客(84条消息) Android支付SDK开发在App中调起H5支付的实现_淡淡的香烟的博客-CSDN博客_android
调用h5支付(84条消息)
Android的Webview中H5支付调起微信支付_2015从头再来的博客-CSDN博客_app内嵌h5微信支付(84条消息)
APP如何调用微信支付H5支付?_paymm的博客-CSDN博客_app唤起微信支付Android 应用内微信 H5 支付 - 简书
(jianshu.com)(84条消息)
安卓笔记:微信H5支付出现的问题_宇文濠的博客-CSDN博客
然后微信就是以下代码来调起的
shouldOverrideUrlLoading来截取url 来跳转页面 不懂的话百度与看源码
mWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
if (url.startsWith("alipays:") || url.startsWith("alipay")) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
// 如下方案可在非微信内部WebView的H5页面中调出微信支付
if (url.startsWith("weixin://wap/pay?")) {
val intent = Intent()
intent.action = Intent.ACTION_VIEW
intent.data = Uri.parse(url)
startActivity(intent)
return true
} else {
val extraHeaders: MutableMap<String, String> = HashMap()
extraHeaders["Referer"] = "https://xxxx.xxxxxx.com"
mWebView?.loadUrl(url, extraHeaders)
}
return true
}
override fun onReceivedSslError(
view: WebView,
handler: SslErrorHandler,
error: SslError
) { // 重写此方法可以让webview处理https请求
handler.proceed()
}
}
以下是支付后 返回webview会有白屏的情况
我参考的一下链接:
(84条消息) Webview加载界面白屏解决方法总结_mikey未雨绸缪的博客-CSDN博客_webview白屏加载不出来
(84条消息) 关于安卓webview中的H5微信支付返回白屏的问题解决方案_sinat_bond的博客-CSDN博客
思路是用一个webview覆盖之前的空白页
webview = binding.webView
webview?.settings?.javaScriptEnabled = true
webview?.settings?.domStorageEnabled = true
webview?.webChromeClient = WebChromeClient()
//该方法支持支付宝和微信支付
webview?.setWebViewClient(object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (url?.startsWith("http:") == true || url?.startsWith("https:") == true) {
return false;
}
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
});
最后代码就写完了 然后总结一下 我百度了webview的基本使用方法 我还是觉得webview动态加载要好 需要及时销毁
Android中WebView的使用,加载H5 - 简书 (jianshu.com)
一个最基本的webview微信支付就写好了 如果哪里不对 望读者指出 谢谢
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)