You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView代理连接不稳定:频繁操作后代理失效求助

Android WebView代理多次加载后失效的解决思路

针对WebView设置代理后,多次点击链接或调用loadUrl后代理被忽略的问题,给出以下实用解决方向:

1. 每次加载前重新确认代理设置

ProxyController的全局代理可能因系统进程调度、WebView进程重启等原因丢失,建议在每次页面跳转或主动加载URL前,重新执行代理配置逻辑:

webview.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        // 页面跳转前重新设置代理
        myproxy(my_proxy_adress)
        view?.loadUrl(request?.url.toString())
        return true
    }
}

// 主动调用loadUrl前也重新配置代理
myproxy(my_proxy_adress)
webview.loadUrl(url)

2. 移除addDirect()规则

代码中添加的.addDirect()会让系统在判定代理不可用时 fallback 到直连,但可能存在系统误判代理状态的情况。尝试移除该规则,强制所有请求走代理:

private fun myproxy(proxy: String) {
    val proxyConfig = ProxyConfig.Builder()
        .addProxyRule(proxy)
        // 移除.addDirect(),取消直连 fallback
        .build()
    ProxyController.getInstance().setProxyOverride(proxyConfig, {}, {})
}

3. 针对WebView进程单独配置代理

Android 10+的WebView可能运行在独立进程,全局代理设置不会自动同步到该进程。可以在Application的onCreate中初始化代理,确保WebView进程启动时就加载配置:

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        // 全局初始化代理,覆盖所有进程
        myproxy(my_proxy_adress)
    }
}

需在AndroidManifest.xml中指定自定义Application类。

4. 检查代理权限与系统限制

Android 12及以上版本设置全局代理需要MANAGE_PROXIES权限,在AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.MANAGE_PROXIES" />

针对API 33+,还需动态申请该权限。

5. 替代方案:通过反射给WebSettings设置代理

如果ProxyController的全局方案不稳定,可以尝试通过反射直接给WebView的WebSettings设置代理(适配多Android版本):

private fun setWebViewProxy(webView: WebView, proxyHost: String, proxyPort: Int) {
    val webSettings = webView.settings
    try {
        // 适配低版本API
        val setProxyMethod = webSettings.javaClass.getMethod(
            "setProxy",
            String::class.java,
            Int::class.javaPrimitiveType
        )
        setProxyMethod.invoke(webSettings, proxyHost, proxyPort)
    } catch (e: Exception) {
        // 适配API 21+
        try {
            val requestClass = Class.forName("android.webkit.WebSettings\$ProxyRequest")
            val requestConstructor = requestClass.getConstructor(
                String::class.java,
                Int::class.javaPrimitiveType
            )
            val request = requestConstructor.newInstance(proxyHost, proxyPort)
            val setProxyOverrideMethod = webSettings.javaClass.getMethod(
                "setProxyOverride",
                requestClass,
                Runnable::class.java
            )
            setProxyOverrideMethod.invoke(webSettings, request, Runnable {})
        } catch (ex: Exception) {
            ex.printStackTrace()
        }
    }
}

调用时直接传入WebView实例、代理地址和端口即可。

内容的提问来源于stack exchange,提问作者ngro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:53:24