Android 强制使用移动网络访问接口

本文介绍了在Android项目中实现手机号一键登录功能时遇到的问题。当设备同时连接WiFi和移动流量时,SDK只能在使用移动流量的情况下获取到手机号。为解决此问题,文章提供了强制使用移动数据网络访问接口的方法,包括添加相关权限、检查网络状态和切换网络等步骤。此外,还提供了用于判断移动数据和WiFi状态的工具类方法。
摘要由CSDN通过智能技术生成

1. 场景

最近项目中加入了手机号一键登录的功能,选用的是中国移动的一键认证SDK,在手机连接上WiFi同时又打开移动流量的时候,发现SDK获取不到手机号,提示当前网络环境获取不到,通过查阅SDK才知道,需要用移动流量访问SDK 才可以拿到手机号,所以在获取手机号时,需要使用移动流量来获取

2. 步骤

  1. 先在项目中添加权限

    //允许程序改变网络连接状态
    <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" />
    
  2. 主要方法

        /**
     * 强制使用移动网络访问接口
     */
    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();
        }
    }
    
  3. 工具类方法

    	/**
         * 判断移动数据是否打开
         *
         * @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;
            }
        }
    
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值