1. 场景
最近项目中加入了手机号一键登录的功能,选用的是中国移动的一键认证SDK,在手机连接上WiFi同时又打开移动流量的时候,发现SDK获取不到手机号,提示当前网络环境获取不到,通过查阅SDK才知道,需要用移动流量访问SDK 才可以拿到手机号,所以在获取手机号时,需要使用移动流量来获取
2. 步骤
-
先在项目中添加权限
//允许程序改变网络连接状态 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> //网络权限 <uses-permission android:name="android.permission.INTERNET" /> //WIFI状态 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-
主要方法
/** * 强制使用移动网络访问接口 */ private void forceSendRequestByMobileData() { //判断移动网络是否可用 if (getDataEnabled(this)) { //判断WiFi是否链接 if (isWifiAvailable(this)) { //WiFi已经链接,判断系统版本,如果在5.0以上,则可以强制使用移动网络 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //系统版本大于或者等于5.0 ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest.Builder builder = new NetworkRequest.Builder(); builder.addCapability(NET_CAPABILITY_INTERNET); //强制使用蜂窝数据网络-移动数据 builder.addTransportType(TRANSPORT_CELLULAR); NetworkRequest build = builder.build(); connectivityManager.requestNetwork(build, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { super.onAvailable(network); Toast.makeText(MainActivity.this, "使用移动网络访问", Toast.LENGTH_LONG).show(); } }); } else { //提示用户 Toast.makeText(MainActivity.this, "请关闭WIFI", Toast.LENGTH_LONG).show(); } }else{ //直接访问 Toast.makeText(MainActivity.this, "使用移动网络访问", Toast.LENGTH_LONG).show(); } } else { //移动网络不可用,提示打开 Toast.makeText(MainActivity.this, "请打开移动网络", Toast.LENGTH_LONG).show(); } }
-
工具类方法
/** * 判断移动数据是否打开 * * @return {@code true}: 是<br>{@code false}: 否 */ public static boolean getDataEnabled(Context context) { try { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); Method getMobileDataEnabledMethod = tm.getClass().getDeclaredMethod("getDataEnabled"); if (null != getMobileDataEnabledMethod) { return (boolean) getMobileDataEnabledMethod.invoke(tm); } } catch (Exception e) { e.printStackTrace(); } return false; } /** * 判断wifi数据是否可用 * <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> * <p>需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p> * * @return {@code true}: 是<br>{@code false}: 否 */ public static boolean isWifiAvailable(Context context) { return getWifiEnabled(context) && isWiFiActive(context); } /** * 判断wifi是否打开 * <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> * * @return {@code true}: 是<br>{@code false}: 否 */ public static boolean getWifiEnabled(Context context) { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); return wifiManager.isWifiEnabled(); } /** * 判断WIFI是否链接 * @param inContext * @return */ public static boolean isWiFiActive(Context inContext) { WifiManager mWifiManager = (WifiManager) inContext.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); int ipAddress = wifiInfo == null ? 0 : wifiInfo.getIpAddress(); if (mWifiManager.isWifiEnabled() && ipAddress != 0) { return true; } else { return false; } }