小编Tri*_*ies的帖子

使用android中的registerNetworkCallback在Wifi和Mobile数据之间切换

我已经在这方面工作了很长一段时间,我能够使它在所有的产品和设备中工作,除了一些运行Marshmallow及以上的三星设备.

这是流程.我有一个OBD可以通过wifi连接,一旦连接,我可以通过我的应用程序开始读取数据,通过打开一个socket/telnetclient到它的IP,它将像192.168.4.1和端口是23.这是目标.需要注意的是,该OBD没有互联网连接.

这是发生了什么.我通过连接到OBD WifiManager.现在我尝试打开一个到IP 192.168.4.1和端口的套接字23.这是代码:

import java.net.Socket;

Socket socket = new Socket("192.168.4.1", 23);
Run Code Online (Sandbox Code Playgroud)

此时如果移动数据被启用,套接字连接将尝试通过移动数据网关找到ip,因为现在wifi将不具有互联网连接,并且只有移动数据可能具有互联网连接,它将具有更高的优先级.

由于IP只能通过wifi访问,我ConnectivityManager通过以下代码指向网关openWifiPort(true):

public void openWifiPort(boolean openState){
    final ConnectivityManager connectivityManager
            = (ConnectivityManager) AppController.getInstance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    if (SDK_INT >= LOLLIPOP) {
        NetworkRequest.Builder request = new NetworkRequest.Builder();
        if(openState) {
            request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
        } else {
            request.addTransportType(ConnectivityManager.TYPE_MOBILE);
            request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        }
        connectivityManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                if (SDK_INT >= LOLLIPOP && SDK_INT < M) {
                    //noinspection deprecation
                    ConnectivityManager.setProcessDefaultNetwork(network);
                } else if (SDK_INT >= M) …
Run Code Online (Sandbox Code Playgroud)

sockets networking android

7
推荐指数
0
解决办法
491
查看次数

标签 统计

android ×1

networking ×1

sockets ×1