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

第一种方式:

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

1. 匹配类:

  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类中实现,如下:

  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有关反射的知识的,或者是忘了的,可以去学习和温习一下)。

  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. Ubuntu中开启和关闭防火墙-摘自网络

    1.关闭ubuntu的防火墙 ufw disable开启防火墙ufw enable 2.卸载了iptablesapt-get remove iptables3.关闭ubuntu中的防火墙的其余命令ip ...

  2. Android网络开启、关闭整理

    package com.my.device_admin.business; import java.lang.reflect.Method; import android.content.Contex ...

  3. [Android Traffic] Android网络开启、关闭整理

    转载: http://blog.csdn.net/tu_bingbing/article/details/8469871 近段时间由于要对手机网络状况进行判断.开启和关闭,从网上找了些资料,现整理如下 ...

  4. Android中如何监听GPS开启和关闭

    转自 chenming 原文 Android中如何监听GPS开启和关闭   摘要: 本文简单总结了如何监听GPS开关的小技巧 有时需要监听GPS的开关(这种需求并不多见).实现的思路是监听代表 GPS ...

  5. Android IntentService 与Alarm开启任务关闭任务

    1:MyService public class MyService extends IntentService{ AlarmManager alarmManager = null; PendingI ...

  6. Android的WiFi开启与关闭

    注意:要首先注册开启和关闭WiFi的权限, <?xml version="1.0" encoding="utf-8"?> <manifest ...

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

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

  8. Android 怎样开启与关闭adb 的认证机制(google adb secure) (adb RSA 指纹认证)

    前言         欢迎大家我分享和推荐好用的代码段~~声明         欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net           ...

  9. Android 开启与关闭软键盘

    http://www.cnblogs.com/weixing/p/3300908.html InputMethodManager imm = (InputMethodManager)getSystem ...

随机推荐

  1. 普通用户如何临时获取root权限

    转自:http://634871.blog.51cto.com/624871/1325907 在实际工作中,公司不会将root用户直接给员工使用,而是通过员工自己的账号临时获得系统的root权限. 1 ...

  2. PHP正则表达式基础入门

    思维导图 介绍 正则表达式,大家在开发中应该是经常用到,现在很多开发语言都有正则表达式的应用,比如JavaScript.Java..Net.PHP 等,我今天就把我对正则表达式的理解跟大家唠唠,不当之 ...

  3. javascript,css延迟加载器

    /** * js/css LazyLoad * * 变量hash记录已经加载过的资源,避免重复加载 * * Z.loadScript('a.js', function() { ... }) * * Z ...

  4. 关于angularjs中的ng-class 变量问题

    时常会用到ng-class.非常的方便,基本的用法就是 当title等于通金所的时候,就增加error-tip这个class,但是,我们有时候这个值不能写死,明白我的意思吗,明白吗,好吧,反正就要是个 ...

  5. Brackets(区间dp)

    Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3624   Accepted: 1879 Descript ...

  6. JavaScript 最佳实践

    这个文档是基于JavaScript社区众多开发者的意见和经验,在开发JavaScript代码上的最佳实践和首选的方案的明细表.因为这是一个推荐的表而非原则性的方案,经验丰富的开发者可能对下面的表达会有 ...

  7. Win10如何隐藏Windows Defender任务栏图标

    导读 Windows 10 至发布以来就内置集成了 Windows Defender 安全防护应用,但有许多用户平常压根儿就没注意到它的存在.微软为了使安全防护功能更加明显,Windows 10 周年 ...

  8. Delphi开发Windows服务程序

    开发步骤: 1.New->Other->Service Application 2.现在一个服务程序的框架已经搭起来了 打开Service1窗口,有几个属性说明一下: AllowPause ...

  9. angular 强制刷新路由,重新加载路由

    angular js ui-route 在使用时默认不是不会刷新路由的,所有有些时候我们需要主动刷新路由. 主动刷新方法是: <a ui-sref="profitManage" ...

  10. Java--读写文件综合

    package javatest; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...