Android Compose WebView加载Odoo页面空白,求正确配置
Android Compose WebView加载Odoo官网空白无报错的解决办法
我使用Android Compose的WebView打开Odoo官网(https://www.odoo.com/)时,页面始终空白,无任何报错或警告,但加载其他页面一切正常。iOS端同款应用可以正常打开该页面,当前代码如下:
class MainActivity : ComponentActivity() { @SuppressLint("SetJavaScriptEnabled") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AndroidView( factory = { context -> WebView(context).apply { webViewClient = WebViewClient() settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW settings.javaScriptEnabled = true settings.domStorageEnabled = true settings.loadWithOverviewMode = true settings.useWideViewPort = true settings.allowContentAccess = true settings.allowFileAccess = true settings.databaseEnabled = true settings.loadsImagesAutomatically = true settings.javaScriptCanOpenWindowsAutomatically = true settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING isScrollbarFadingEnabled = true } }, update = { it.loadUrl("https://www.odoo.com/") } ) } } }
修正后的WebView配置方案
针对Odoo官网的加载特性,需要调整以下几个关键配置:
- 替换WebViewClient为WebChromeClient:Odoo依赖大量JS交互和控制台日志输出,WebChromeClient能更好支持这类特性,还能捕获JS层面的错误日志,方便排查问题。
- 添加适配性User-Agent:部分网站会根据UA做设备适配,设置接近主流移动端Chrome的UA可以避免被网站拦截或适配异常。
- 开启第三方Cookie支持:Android 11及以上系统默认限制第三方Cookie,Odoo加载过程中可能依赖第三方资源,需手动开启该权限。
- 调整缓存策略:设置合理的缓存模式,避免旧缓存导致的加载异常。
完整修正代码
import android.os.Build import android.util.Log import android.webkit.* import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.ui.platform.AndroidView class MainActivity : ComponentActivity() { @SuppressLint("SetJavaScriptEnabled") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AndroidView( factory = { context -> WebView(context).apply { // 使用WebChromeClient支持更多JS特性并捕获控制台日志 webChromeClient = object : WebChromeClient() { override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean { Log.d("WebViewDebug", "${consoleMessage.message()} -- 行号: ${consoleMessage.lineNumber()} 来源: ${consoleMessage.sourceId()}") return super.onConsoleMessage(consoleMessage) } } settings.apply { mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW javaScriptEnabled = true domStorageEnabled = true loadWithOverviewMode = true useWideViewPort = true allowContentAccess = true allowFileAccess = true databaseEnabled = true loadsImagesAutomatically = true javaScriptCanOpenWindowsAutomatically = true layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING // 设置适配移动端Chrome的User-Agent userAgentString = "Mozilla/5.0 (Linux; Android 13; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36" // Android 11+ 开启第三方Cookie支持 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setAppCacheEnabled(true) CookieManager.getInstance().setAcceptThirdPartyCookies(this@apply, true) } // 设置默认缓存模式,避免缓存异常 cacheMode = WebSettings.LOAD_DEFAULT } isScrollbarFadingEnabled = true } }, update = { it.loadUrl("https://www.odoo.com/") } ) } } }
额外注意事项
确保在AndroidManifest.xml中添加必要的网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
内容的提问来源于stack exchange,提问作者Saher Al-Sous
相关产品推荐
相关产品推荐

