如果移动数据已打开,wifi也已打开但没有数据。那么如何通过WIFI发送请求

Posted

技术标签:

【中文标题】如果移动数据已打开,wifi也已打开但没有数据。那么如何通过WIFI发送请求【英文标题】:if mobile data is on and wifi is also on but does not have data.then how to send request by WIFI 【发布时间】:2018-04-20 16:33:00 【问题描述】:

如果您只想使用 Wifi,请使用此代码。 请确保 android 版本应大于 21。

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static void stayOnWifi(Context context) 
    final ConnectivityManager connection_manager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

    connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() 

        @Override
        public void onAvailable(Network network) 
            ConnectivityManager.setProcessDefaultNetwork(network);
        
    );

【问题讨论】:

【参考方案1】:

在wifi没有数据的情况下要从WIFI发送请求时使用。

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static void stayOnWifi(Context context) 
    final ConnectivityManager connection_manager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

    connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() 

        @Override
        public void onAvailable(Network network) 
            ConnectivityManager.setProcessDefaultNetwork(network);
        
    );

如果 wifi 没有任何数据,当你想从 wifi 发送请求时使用此方法。 上面代码的问题是当你强制设置数据使用优先级时。如果我们设置 wifi 优先应用程序将无法使用移动数据,如果为移动数据数据设置优先级,那么无论 wifi 是否有数据,应用程序都无法使用 wifi .


问题解决方案我们应该使用广播,意思是当我们想从没有数据的wifi发送请求时使用上述方法,完成使用广播后,它设置可以是移动或wifi的可用数据。意味着限制将被取消。

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

public static void stayOnMobileData(Context context) 
    final ConnectivityManager connection_manager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
    connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() 
        @Override
        public void onAvailable(Network network) 
            ConnectivityManager.setProcessDefaultNetwork(network);
        
    );


广播

public class NetworkStateChangeBroadcast extends BroadcastReceiver 
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

    @Override
    public void onReceive(Context context, Intent intent) 
        if (in.bets.bettywifi.ui.common.BaseActivity.checkNetworkStatus(context)) 
            final ConnectivityManager connMgr = (ConnectivityManager) context
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            final android.net.NetworkInfo wifi = connMgr
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI);

            final android.net.NetworkInfo mobile = connMgr
                    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            if (wifi.isConnected()) 

                BaseActivity.stayOnWifi(context);
             else if (mobile.isConnected()) 

                BaseActivity.stayOnMobileData(context);

            
        
    

【讨论】:

【参考方案2】:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static void stayOnWifi(Context context) 
    final ConnectivityManager connection_manager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

    connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() 

        @Override
        public void onAvailable(Network network) 
            ConnectivityManager.setProcessDefaultNetwork(network);
        
    );

【讨论】:

以上是关于如果移动数据已打开,wifi也已打开但没有数据。那么如何通过WIFI发送请求的主要内容,如果未能解决你的问题,请参考以下文章

家里WIFI显示已连接,但无法访问互联网是怎么回事?

为啥连接WIFI(电脑)后,csdn的博客网站打不开?

打开和关闭wifi和移动数据链接

打开和关闭wifi和移动数据链接

打开移动数据时如何从wifi网络访问本地url?

在Android 6中打开wifi时如何为任何应用程序强制使用移动数据