关于Android 如何实现mobile data on/off功能

简介:

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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

1
2
3
4
5
6
7
8
9
10
11
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中加入

1
2
< uses-permission  android:name = "android.permission.MODIFY_PHONE_STATE" >
</ uses-permission >

此权限。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//检查当前的网络状态
         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连接还是正常的移动数据连接

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

1
2
3
4
5
6
7
8
9
10
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上了解到的,而且我也均真正测试过,是好用的。










本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1377988,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
164 0
|
7月前
|
安全 Linux Android开发
Android 安全功能
Android 安全功能
88 0
|
2月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
76 4
Android开发表情emoji功能开发
|
2月前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
57 3
|
4月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
449 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
3月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
4月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
6月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
292 2
|
6月前
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
126 3
|
7月前
|
移动开发 监控 Android开发
构建高效Android应用:从内存优化到电池寿命代码之美:从功能实现到艺术创作
【5月更文挑战第28天】 在移动开发领域,特别是针对Android系统,性能优化始终是关键议题之一。本文深入探讨了如何通过细致的内存管理和电池使用策略,提升Android应用的运行效率和用户体验。文章不仅涵盖了现代Android设备上常见的内存泄漏问题,还提出了有效的解决方案,包括代码级优化和使用工具进行诊断。同时,文中也详细阐述了如何通过减少不必要的后台服务、合理管理设备唤醒锁以及优化网络调用等手段延长应用的电池续航时间。这些方法和技术旨在帮助开发者构建更加健壮、高效的Android应用程序。