+-
android – 强制WebView在某个网络上运行
是否可以通过指定的 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在某个网络上运行 - 乐贴网