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

Nin*_*les 5 java sockets networking android wifi

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

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

我尝试过使用 Mobiwol、Super Download 和 Speedify(似乎只有 Speedify 有效)等 3rd 方应用程序,但我希望能够在不需要这些应用程序的情况下执行此操作。

我还尝试在开发者设置中打开“保持移动数据打开”,以及“智能网络开关”,它只会切换到我的蜂窝数据,因此我的应用程序无法工作,因为它在技术上并未连接到 WiFi。

更新:我设法让蜂窝网络在我的应用程序中通过 WiFi 连接时工作(感谢 Remy Lebeau 以及如何在 Android 上连接 WIFI 后通过移动网络保持连接?)。请参阅下面的代码。

现在我希望能够在后台应用程序(例如通知)中使用蜂窝数据,或者如果我想打开浏览器等。有没有办法做到这一点?

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);
Run Code Online (Sandbox Code Playgroud)

Gas*_*lén 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
}
Run Code Online (Sandbox Code Playgroud)

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

“android.permission.ACCESS_NETWORK_STATE”

thsi是一个检查wifi连接的方法,当return 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果连接了 WiFi,新连接通常会使用 WiFi 而不是蜂窝网络。如果您想在 WiFi 处于活动状态时强制连接使用蜂窝网络,请使用 `ConnectivityManager` 获取蜂窝网络 `Network`,然后使用 `Network.getSocketFactory().createSocket()`、`Network.bindSocket()`、或“Network.openConnection()”来创建连接。如果您想强制特定连接使用 WiFi,请执行相同的操作。因此,您可以使用 ConnectivityManager.bindProcessToNetwork() 让您的应用程序默认使用蜂窝网络,然后使用 WiFi Network 来建立设备连接。 (6认同)