
是否可以通过指定的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在某个网络上运行所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)