android– 强制WebView在某个网络上运行

android– 强制WebView在某个网络上运行,第1张

概述是否可以通过指定的Network强制WebView加载URL?我的设备有两个网络连接打开:wifi和移动数据.移动数据网络被设置为传出连接的默认网络(因此连接管理器返回connectivityManager.getActiveNetwork()的移动数据网络).我正在尝试加载的网页(来自http://10.0.0.1:80)正在通过wifi连接的

是否可以通过指定的Network强制WebView加载URL?

我的设备有两个网络连接打开:wifi和移动数据.
移动数据网络被设置为传出连接的默认网络(因此连接管理器返回connectivityManager.getActiveNetwork()的移动数据网络).

我正在尝试加载的网页(来自http://10.0.0.1:80)正在通过wifi连接的网络服务器上运行.因此,Web视图无法加载到页面,因为它无法通过移动数据加载.

解决方法:

所以我自己在这个主题中挖了一点,发现了一些有用的信息:

>如果连接应使用给定网络,则需要bind the sockets manually到该网络或直接create the sockets via a socket factory.
> WebVIEw的标准实现不可能设置套接字工厂或让它使用给定的套接字.
>但是有可能到bind the complete app process to a network.这将确保从那一刻开始,所有新创建的套接字都将绑定到该网络. (设置默认网络的原始方法在第23级已弃用,请在下面的代码中查看方法bindProcesstoNetwork().)
>多个网络连接仅适用于运行API level 21 and higher的AndroID设备.
> NetworkCallback可用于监听满足指定NetworkRequest的任何新连接的网络.

有了这些知识,我终于找到了一个有效的解决方案:

ConnectionFragment.java

public class ConnectionFragment extends Fragment {    private static final String TAG = ConnectionFragment.class.getSimplename();    private final NetworkCallback networkCallback = new NetworkCallback();    private ConnectivityManager connectivityManager;    @OverrIDe    public voID onCreate(@Nullable Bundle savedInstanceState) {        Log.v(TAG, "onCreate");        super.onCreate(savedInstanceState);        connectivityManager = (ConnectivityManager) getActivity().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);    }    @OverrIDe    public voID onStart() {        Log.v(TAG, "onStart");        super.onStart();        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LolliPOP) {            registerNetworkCallback();        }    }    @OverrIDe    public voID onStop() {        Log.v(TAG, "onStop");        super.onStop();        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LolliPOP) {            unregisterNetworkCallback();        }    }    @RequiresAPI(API = Build.VERSION_CODES.LolliPOP)    private voID registerNetworkCallback() {        Log.v(TAG, "registerNetworkCallback");        final NetworkRequest networkRequest = new NetworkRequest.Builder()                .addTransportType(NetworkCapabilitIEs.TRANSPORT_WIFI)                .build();        connectivityManager.registerNetworkCallback(networkRequest, networkCallback);    }    @RequiresAPI(API = Build.VERSION_CODES.LolliPOP)    private voID unregisterNetworkCallback() {        Log.v(TAG, "unregisterNetworkCallback");        connectivityManager.unregisterNetworkCallback(networkCallback);    }    @RequiresAPI(API = Build.VERSION_CODES.LolliPOP)    private class NetworkCallback extends ConnectivityManager.NetworkCallback {        @OverrIDe        public voID onAvailable(Network network) {            Log.v(TAG, "onAvailable");            bindProcesstoNetwork(network);        }        @OverrIDe        public voID onLost(Network network) {            Log.v(TAG, "onLost");            bindProcesstoNetwork(null);        }        private voID bindProcesstoNetwork(final Network network) {            Log.v(TAG, "bindProcesstoNetwork: " + network);            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                connectivityManager.bindProcesstoNetwork(network);            } else {                ConnectivityManager.setProcessDefaultNetwork(network);            }        }    }}

我希望这会对某人有所帮助.

但请记住:对于依赖其他网络的所有其他连接,您需要手动配置套接字.

最好的祝福,
winklerrr

总结

以上是内存溢出为你收集整理的android – 强制WebView在某个网络上运行全部内容,希望文章能够帮你解决android – 强制WebView在某个网络上运行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1111359.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存