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

Tri*_*ies 7 sockets networking android

我已经在这方面工作了很长一段时间,我能够使它在所有的产品和设备中工作,除了一些运行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) {
                    connectivityManager.bindProcessToNetwork(network);
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

现在getway指向Wifi,我能够打开到OBD的套接字,我能够从我的应用程序与设备进行交互.由于网关已指向wifi并且OBD没有互联网接入,即使移动数据已打开,我也无法使用互联网.

要启用此功能,一旦套接字连接,我通过调用相同的方法将网关切换回移动设备,但这次参数为false,即.openWifiPort(false).

这就是它变得棘手的问题.此开关适用于所有移动设备,无论制造商,型号和Android版本如何.但是这个开关在三星的某些设备中无效.

对此有任何建议真的很有用.提前致谢.