【问题标题】:Use cellular data while connected to Wi-Fi with no internet在没有互联网的情况下连接到 Wi-Fi 时使用蜂窝数据
【发布时间】:2018-07-01 11:48:01
【问题描述】:

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

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

我曾尝试使用 Mobiwol、Super Download 和 Speedify 等 3rd 方应用程序(似乎只有 Speedify 有效),但我希望能够在不需要这些应用程序的情况下做到这一点。

我还尝试在开发人员设置中打开“保持移动数据打开”,以及仅切换到我的蜂窝数据的“智能网络开关”,因此我的应用无法运行,因为它在技术上没有连接到 WiFi。

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

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

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);

【问题讨论】:

    标签: java android sockets networking wifi


    【解决方案1】:

    也许这个 sn-ps 对你有用,它会检查是否有 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
    }
    

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

    “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
        }
    }
    

    【讨论】:

    • 我没有点击减一:O
    • 如果连接了 WiFi,新连接通常会使用 WiFi 而不是蜂窝网络。如果您想在 WiFi 处于活动状态时强制连接使用蜂窝网络,请使用ConnectivityManager 获取蜂窝网络Network,然后使用Network.getSocketFactory().createSocket()Network.bindSocket()Network.openConnection() 来创建连接。如果您想强制特定连接使用 WiFi,请执行相同操作。因此,您可以使用 ConnectivityManager.bindProcessToNetwork() 让您的应用默认使用蜂窝网络,然后使用 WiFi Network 进行设备连接。
    • @RemyLebeau 你能提供正确的源代码吗?
    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多