在没有互联网的情况下连接到Wi-Fi时使用移动数据

时间:2018-01-22 18:57:01

标签: java android sockets networking wifi

我正在创建一个Android应用程序,通过WiFi连接到另一台设备,通过套接字连接发送和接收数据。我希望能够在保持与此设备连接的同时使用我的手机数据执行其他操作(例如浏览)。

在iOS设备上,将网络设置更改为静态并将路由器字段保留为空白似乎可以正常工作。但是在我的Android设备(运行Android 7.0的三星Galaxy Note 5)上,如果我将其留空,它将不会让我保存网络设置。

我尝试使用第三方应用程序,如Mobiwol,Super Download和Speedify(只有Speedify似乎有效),但我希望能够在不需要这些应用程序的情况下完成此操作。

我还尝试在开发人员设置中打开“保持移动数据已打开”,以及“智能网络交换机”,它只是切换到我的手机数据,因此我的应用程序无法正常工作,因为它在技术上并未连接到WiFi。

更新:在我的应用中通过WiFi连接时,我设法让手机正常工作(感谢Remy Lebeau和How to stay connected through mobile network after WIFI is connected on Android?)。请参阅以下代码。

现在我希望能够在后台应用程序中使用移动数据,例如通知,或者我想打开浏览器等。有没有办法做到这一点? < / p>

NetworkRequest.Builder req = new NetworkRequest.Builder();
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 
req.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 

ConnectivityManager.NetworkCallback networkCallback = new 
ConnectivityManager.NetworkCallback() {

     @Override
     public void onAvailable(Network network) {
            connectivityManager.bindProcessToNetwork(network)                   
     }
};

connectivityManager.requestNetwork(req.build(), networkCallback);

1 个答案:

答案 0 :(得分:0)

也许这个片段适合您,它会检查是否有wifi连接来完成这项工作,或者它会通过移动连接来实现

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

if (wifi.isConnected()){
    // If Wi-Fi connected
}

if (mobile.isConnected()) {
    // If Internet connected
}

请务必将此添加到您的清单中:

  

&#34; android.permission.ACCESS_NETWORK_STATE&#34;

这是一种检查wifi连接的方法,你可以在返回false时将移动数据添加为else语句

private boolean checkWifiOnAndConnected() {
    WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON

        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();

        if( wifiInfo.getNetworkId() == -1 ){
            return false; // Not connected to an access point
        }
        return true; // Connected to an access point
    }
    else {
        return false; // Wi-Fi adapter is OFF
    }
}