关于Android如何实现mobiledataon/off功能-创新互联

最近在做mobile data on/off的功能,可能我说mobile data大家没什么概念,但是我如果说wifi on/off大家一定知道,而且也晓得如何去实现,mobile data其实就是我们不用wifi的时候,用自己手机里的SIM卡上网流量,即那个数据交换的开关。

创新互联成立与2013年,先为武宣等服务建站,武宣等地企业,进行企业商务咨询服务。为武宣企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

这部分对我来说其实也是陌生的地方,不过通过上网查资料,也逐渐了解了一些,下面跟大伙分享一下:

实现这个功能,我们需要根据Android系统的版本将其分成两个阶段,分别实现。

在2.3版本以下,我们需要用所谓的Java反射机制去实现

public void switchMobileData(boolean on) throws Exception{
    try{
        Method dataConnSwitchMethod;
        Class telephonyManagerClass;
        Object ITelephonyStub;
        Class ITelephonyClass;
        TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        switch(telephonyManager.getDataState()){
        case TelephonyManager.DATA_CONNECTED:
            System.out.println("DATA_CONNECTED");
            break;
        case TelephonyManager.DATA_DISCONNECTED:
            System.out.println("DATA_DISCONNECTED");
            break;
        }
                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                        
        telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
        Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
        getITelephonyMethod.setAccessible(true);
        ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
        ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());
                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                        
        if(on){
            System.out.println("on is true" );
            dataConnSwitchMethod = ITelephonyClass.getDeclaredMethod("enableDataConnectivity");
        }
        else{
            System.out.println("on is false" );
            dataConnSwitchMethod = ITelephonyClass.getDeclaredMethod("disableDataConnectivity");
        }
        dataConnSwitchMethod.setAccessible(true);
        dataConnSwitchMethod.invoke(ITelephonyStub);
    }
    catch (Exception e) {
        // TODO: handle exception
        Log.e("Error", e.toString());
    }
}

使用时直接调用上面的函数,参数列表true/false分别代表开/关。不过2.3版本以下此功能有一个限制,就是必须在手动将数据交换图标点亮后,才能去控制mobile data的on/off,而且,就是在off之后,数据交换图标还是亮着的状态,不过这个时候上不了网罢了,但是如果你不亮开数据交换图标,再怎么调用也还是没有用的。

在2.3版本及以上的Android系统中,可以使用 IConnectivityManager.setMobileDataEnabled()这是个隐藏的方法,就是直接控制手机 'Settings -> Wireless & network -> Mobile network settings -> Data Enabled' 这个操作路径下的方法,也就是我想控制的mobile data

public static  void setMobileDataEnabled(Context context, boolean enabled){
            final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            Class cmClass = Class.forName(cm.getClass().getName());
            final Field iConnectivityManagerField = cmClass.getDeclaredField("mService");
            iConnectivityManagerField.setAccessible(true);
            final Object iConnectivityManager = iConnectivityManagerField.get(cm);
            final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
            final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled",  Boolean.TYPE );    
            setMobileDataEnabledMethod.setAccessible(true);
            setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
        }

使用时也是直接调用就可以,context传入的是当前activity的对象,enabled传入true/false,控制开关。

以上两个方法就是针对 mobile data on/off的实现,大家不要忘记需要在AndroidManifest.xml中加入


此权限。

说到这就顺便把如何查看当前设备的网络连接跟大伙说一下,因为通常这些都是配套使用的。

//检查当前的网络状态
        public static  void checkNetworkState(Menu menu, Context context){
            ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo wifiinfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            NetworkInfo mobileinfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                                                         
            if(wifiinfo != null && wifiinfo.isAvailable())
            {
                //如果wifi已经打开
                if(wifiinfo.isConnected())
                {
                    //wifi已经连接上
                }
                else
                {
                    //wifi可用,但是没有进行连接
                }
            }
            else
            {
                //如果wifi为关闭状态
            }
                                                         
            if(mobileinfo != null && mobileinfo.isAvailable())
            {
                //移动数据连接 可用
                                                             
                if(mobileinfo.isConnected())
                {
                    //移动数据已经连接
                }
                else
                {
                    //移动数据未连接
                }
            }
            else
            {
                //说明该设备并没有移动数据连接功能
            }
                                                     
        }

上面的方法是判断wifi连接还是正常的移动数据连接

还有一种方法就是比较全的,可以把所有的与当前设备连接或可以使用的网络显示出来

public void showNetworkAvailable(){
        ConnectivityManager cm = (ConnectivityManager)MainActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] nwInfos = cm.getAllNetworkInfo();
        for(NetworkInfo nwInfo : nwInfos){
            System.out.println("network type name="+nwInfo.getTypeName());
            System.out.println("network available="+nwInfo.isAvailable());
            System.out.println("network c_or-c="+nwInfo.isConnectedOrConnecting());
            System.out.println("network connected="+nwInfo.isConnected());
        }
    }

以上资料大部分是从国外的StackOverflow上了解到的,而且我也均真正测试过,是好用的。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:关于Android如何实现mobiledataon/off功能-创新互联
文章网址:http://cdiso.cn/article/cdiihj.html

其他资讯