如果移动数据已打开,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发送请求的主要内容,如果未能解决你的问题,请参考以下文章