开启和关闭移动数据网络有两种方法:一种是通过操作系统的数据库改变APN(网络接入点),从而实现开启和关闭移动数据网络,另一种是通过反射调用系统(ConnectivityManager)的setMoblieDataEnabled方法,通过操作该方法开启和关闭系统移动数据,同时也可以通过反射调用getMoblieDataEnabled方法获取当前的开启和关闭状态。

第一种方式:

通过APN的方式开启和关闭很威猛啊,为什么这么说呢,废话不多说,先看代码:

1. 匹配类:

[java] view plaincopy
  1. //创建一个匹配类,用于匹配移动、电信、联通的APN
  2. public final class APNMatchTools
  3. {
  4. // 中国移动cmwap
  5. public static String CMWAP = "cmwap";
  6. // 中国移动cmnet
  7. public static String CMNET = "cmnet";
  8. // 中国联通3gwap APN
  9. public static String GWAP_3 = "3gwap";
  10. // 中国联通3gnet APN
  11. public static String GNET_3 = "3gnet";
  12. // 中国联通uni wap APN
  13. public static String UNIWAP = "uniwap";
  14. // 中国联通uni net APN
  15. public static String UNINET = "uninet";
  16. // 中国电信 ct wap APN
  17. public static String CTWAP = "ctwap";
  18. // 中国电信ct net APN
  19. public static String CTNET = "ctnet";
  20. public static String matchAPN(String currentName)
  21. {
  22. if ("".equals(currentName) || null == currentName)
  23. {
  24. return "";
  25. }
  26. // 参数转为小写
  27. currentName = currentName.toLowerCase();
  28. // 检查参数是否与各APN匹配,返回匹配值
  29. if (currentName.startsWith(CMNET))
  30. return CMNET;
  31. else if (currentName.startsWith(CMWAP))
  32. return CMWAP;
  33. else if (currentName.startsWith(GNET_3))
  34. return GNET_3;
  35. else if (currentName.startsWith(GWAP_3))
  36. return GWAP_3;
  37. else if (currentName.startsWith(UNINET))
  38. return UNINET;
  39. else if (currentName.startsWith(UNIWAP))
  40. return UNIWAP;
  41. else if (currentName.startsWith(CTWAP))
  42. return CTWAP;
  43. else if (currentName.startsWith(CTNET))
  44. return CTNET;
  45. else if (currentName.startsWith("default"))
  46. return "default";
  47. else
  48. return "";
  49. }
  50. }

2. 开启和关闭APN的方法在ApnSwitchTest类中实现,如下:

[java] view plaincopy
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import android.app.Activity;
  4. import android.content.ContentValues;
  5. import android.database.Cursor;
  6. import android.net.Uri;
  7. import android.util.Log;
  8. public class ApnSwitchTest extends Activity
  9. {
  10. Uri uri = Uri.parse("content://telephony/carriers/preferapn");
  11. // 开启APN
  12. public void openAPN()
  13. {
  14. List<APN> list = getAPNList();
  15. for (APN apn : list)
  16. {
  17. ContentValues cv = new ContentValues();
  18. // 获取及保存移动或联通手机卡的APN网络匹配
  19. cv.put("apn", APNMatchTools.matchAPN(apn.apn));
  20. cv.put("type", APNMatchTools.matchAPN(apn.type));
  21. // 更新系统数据库,改变移动网络状态
  22. getContentResolver().update(uri, cv, "_id=?", new String[]
  23. {
  24. apn.id
  25. });
  26. }
  27. }
  28. // 关闭APN
  29. public void closeAPN()
  30. {
  31. List<APN> list = getAPNList();
  32. for (APN apn : list)
  33. {
  34. // 创建ContentValues保存数据
  35. ContentValues cv = new ContentValues();
  36. // 添加"close"匹配一个错误的APN,关闭网络
  37. cv.put("apn", APNMatchTools.matchAPN(apn.apn) + "close");
  38. cv.put("type", APNMatchTools.matchAPN(apn.type) + "close");
  39. // 更新系统数据库,改变移动网络状态
  40. getContentResolver().update(uri, cv, "_id=?", new String[]
  41. {
  42. apn.id
  43. });
  44. }
  45. }
  46. public static class APN
  47. {
  48. String id;
  49. String apn;
  50. String type;
  51. }
  52. private List<APN> getAPNList()
  53. {
  54. // current不为空表示可以使用的APN
  55. String projection[] =
  56. {
  57. "_id, apn, type, current"
  58. };
  59. // 查询获取系统数据库的内容
  60. Cursor cr = getContentResolver().query(uri, projection, null, null, null);
  61. // 创建一个List集合
  62. List<APN> list = new ArrayList<APN>();
  63. while (cr != null && cr.moveToNext())
  64. {
  65. Log.d("ApnSwitch", "id" + cr.getString(cr.getColumnIndex("_id")) + " \n" + "apn"
  66. + cr.getString(cr.getColumnIndex("apn")) + "\n" + "type"
  67. + cr.getString(cr.getColumnIndex("type")) + "\n" + "current"
  68. + cr.getString(cr.getColumnIndex("current")));
  69. APN a = new APN();
  70. a.id = cr.getString(cr.getColumnIndex("_id"));
  71. a.apn = cr.getString(cr.getColumnIndex("apn"));
  72. a.type = cr.getString(cr.getColumnIndex("type"));
  73. list.add(a);
  74. }
  75. if (cr != null)
  76. cr.close();
  77. return list;
  78. }
  79. }<span style="font-family: 'Comic Sans MS'; "> </span>

最后,别忘了在AndroidManifext.xml文件中添加访问权限<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />

亲们,从上面的代码中看出什么来了么,没错,通过APN的方式就是修改数据库,关闭APN其实就是给它随便匹配一个错误的APN。为什么说这种方法很生猛呢,当你通过这个方式关闭APN后,你在通过手机上的快捷开关开启移动数据网络时,是没效果的,也就是说开启不了,除非你再用同样的方法开启APN。

第二种方式:

这就奇怪了,关闭APN后,为什么再通过手机上的快捷开关(AppWidget)开启不了呢,这个问题就值得思考了,说明快捷开关其实并不是通过这个方式来开启和关闭移动网络的。道理很简单,想想那些快捷开关是怎么样根据开启和关闭移动网络,然后更换亮和暗的图标的呢(更新UI)。这里肯定会涉及到一个获取系统当前开启和关闭移动数据状态的问题。那到底是怎样获取的,是通过什么样的形式的?其实道理很简单,就是通过调用系统的getMobileDataState和setMobileData(我是这么知道它是调用到这个方法的呢?亲们,如果你有android手机,把它插到电脑上,然后开启已经搭建好的android开发环境的eclpise,打开logcat面板,相应地在你手机的快捷开关上开启和关闭移动网络,然后看看在logcat面板上出现什么了)。

既然知道是调用上面这两个方法了,我们是不是就可以直接调用这个两个方法实现了?NO,没这么简单,这个两个方法不能直接调用,必须通过反射机制调用(呵呵,没接触过java有关反射的知识的,或者是忘了的,可以去学习和温习一下)。

[java] view plaincopy
  1. /**
  2. * 设置手机的移动数据
  3. */
  4. public static void setMobileData(Context pContext, boolean pBoolean) {
  5. try {
  6. ConnectivityManager mConnectivityManager = (ConnectivityManager) pContext.getSystemService(Context.CONNECTIVITY_SERVICE);
  7. Class ownerClass = mConnectivityManager.getClass();
  8. Class[] argsClass = new Class[1];
  9. argsClass[0] = boolean.class;
  10. Method method = ownerClass.getMethod("setMobileDataEnabled", argsClass);
  11. method.invoke(mConnectivityManager, pBoolean);
  12. } catch (Exception e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. System.out.println("移动数据设置错误: " + e.toString());
  16. }
  17. }
  18. /**
  19. * 返回手机移动数据的状态
  20. *
  21. * @param pContext
  22. * @param arg
  23. *            默认填null
  24. * @return true 连接 false 未连接
  25. */
  26. public static boolean getMobileDataState(Context pContext, Object[] arg) {
  27. try {
  28. ConnectivityManager mConnectivityManager = (ConnectivityManager) pContext.getSystemService(Context.CONNECTIVITY_SERVICE);
  29. Class ownerClass = mConnectivityManager.getClass();
  30. Class[] argsClass = null;
  31. if (arg != null) {
  32. argsClass = new Class[1];
  33. argsClass[0] = arg.getClass();
  34. }
  35. Method method = ownerClass.getMethod("getMobileDataEnabled", argsClass);
  36. Boolean isOpen = (Boolean) method.invoke(mConnectivityManager, arg);
  37. return isOpen;
  38. } catch (Exception e) {
  39. // TODO: handle exception
  40. System.out.println("得到移动数据状态出错");
  41. return false;
  42. }
  43. }</span>

最后,别忘了在AndroidMannifest.xml文件里添加访问权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />,

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

通过上面的代码可以知道,当开启移动网络时调用:

setMobileData(context,true),关闭调用setMobileData(context,false),通过getMobileDataStatus(context)方法返回的布尔值判断当移动数据网络前状态的开启和关闭。

转自:http://blog.csdn.net/fangzhibin4712/article/details/26563285

实现开启和关闭android移动网络(转)相关推荐

  1. 实现开启和关闭Android移动网络(做AppWidget开发的收获)

    之前在做Android AppWidget这方面的开发,本人菜鸟一个,刚接触android不久.所以在开发的过程中不免遇到诸多难处,不过在解决问题中收获知识是一种非常刺激的体验.接下来是本人在开发开关 ...

  2. android调用关闭移动数据,android开启和关闭移动网络

    转自:http://blog.csdn.net/stevenhu_223/article/details/7860964 /** * 移动数据开启和关闭 * * @param context * @p ...

  3. Android AlertDialog 对话框开启和关闭输入法问题

    Android AlertDialog 对话框开启和关闭输入法问题 AlertDialog 对话框是android jar包自带的对话框,说实话 真的很丑,黑白相间,不是很推荐使用.大多时候 特别是项 ...

  4. 正确姿势临时和永久开启关闭Android的SELinux

          正确姿势临时和永久关闭Android的SELinux Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux基础知识 Andro ...

  5. Android手动控制软键盘的开启和关闭,判断软键盘是否显示;

    工具类,拿走就能用: import android.annotation.TargetApi; import android.app.Activity; import android.content. ...

  6. Android 10.0 开启和关闭护眼模式

    1.概述 在10.0系统的产品定制化中,由于一些定制化开发设备中,需要护眼模式,而护眼模式功能开启和关闭 也需要提供接口供app调用,这就需要在系统api中自定义的服务中,提供开启关闭护眼模式的接口, ...

  7. android volte 开关,魅蓝5怎么开通VoLTE?魅蓝5开启与关闭VoLTE图文教程

    全新发布的魅蓝5跟随时代潮流,依旧支持VoLTE高清语音通话,这也是目前一项新的科技功能,相信接下来的国产手机陆陆续续会具备这一功能.当然了,要想在手机上使用这一服务,前提需要进入手机里面开通即可.那 ...

  8. android去掉便携式wifi热点,Android 获取便携式wifi热点开关状态、热点开启与关闭...

    最近做了这两个功能: 1.获取便携式wifi热点开关状态: 2.热点的开启与关闭. 第二个功能就不用说了,百度一搜一大把:第一个功能,在百度基本找不到,最后我是在google找到的,getWifiAp ...

  9. Android 获取便携式热点开关状态、热点开启与关闭

    最近做了这两个功能: 1.获取便携式热点开关状态: 2.热点的开启与关闭. 第二个功能就不用说了,百度一搜一大把:第一个功能,在百度基本找不到,最后我是在google找到的,getWifiApStat ...

最新文章

  1. Ext-第一课基本配置
  2. [Java基础] Java如何实现条件编译
  3. 跨域请求设置withCredentials
  4. MATLAB实战系列(三十四)-MATLAB基于PCA-LDA模糊神经网络的人脸识别
  5. python电子相册制作软件下载_艾奇KTV电子相册制作软件
  6. 用ASP.NET Core构建可检测的高可用服务--学习笔记
  7. dijkstra算法和floyd算法(C语言)
  8. redis开启redis_Redis聚类
  9. 英国拟对英伟达收购Arm展开深入调查
  10. echarts3.0版本断点连线的处理
  11. HDU2013 蟠桃记【递推】
  12. #大数加减乘除#校赛D题solve
  13. sqlplus命令支持上、下翻功能
  14. 电子电路基础 (4)——电阻的认识
  15. 回归模型1:优化的灰色模型matlab实现
  16. Mac 配置L2TP 隧道连接操作步骤
  17. photoshop之小技巧
  18. 【百问网】物联网项目学习总结
  19. 晚还款没事,各行信用卡容时容差服务大汇总!
  20. Cadence ic618 操作备忘录

热门文章

  1. Win8永久激活工具,亲测,可用!
  2. 艾美捷细胞失巢凋亡检测试剂盒测定原理
  3. 朋友入职字节跳动,测开岗,分享面试经验,大厂版测试笔记分享
  4. 设置QQ支持临时会话
  5. LVGL snapshot截图功能
  6. 关于腾讯QQ登录提示“个人文件夹没有读写权限,请修改相应权限后再尝试”的解决方法...
  7. Simulink 中连续与离散模型的区别
  8. Nacos 未授权访问漏洞
  9. MCE 抗乳腺癌化合物库上线丨靶向乳腺癌知多少?
  10. 所付出的努力终不会被辜负~江南大学计算机初试考研经验分享