首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >强制WebView在某一网络上运行

强制WebView在某一网络上运行
EN

Stack Overflow用户
提问于 2017-09-15 15:53:27
回答 1查看 1.3K关注 0票数 8

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

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

我试图加载的网页(从http://10.0.0.1:80)运行在一个通过wifi连接的web服务器上。因此,web视图无法加载到页面,因为它通过移动数据不可用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-21 09:38:37

因此,我自己在这个话题上做了更多的研究,发现了一些有用的信息:

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

ConnectionFragment.java

代码语言:javascript
运行
复制
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);
            }
        }

    }

}

我希望这能帮到别人。

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

诚挚的问候,

温克勒尔

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46243435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档