开启和关闭移动数据网络有两种方法:一种是通过操作系统的数据库改变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. 新浪微博客户端(14)-截取回调地址中的授权成功的请求标记,换取access_token

    DJOAuthViewController.m #import "DJOAuthViewController.h" #import "AFNetworking.h&quo ...

  2. ETHERNET数据包格式( IP & UDP & ICMP & ARP )

    ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...

  3. 关于设置SQLPLUS提示符样式的方法----登陆配置文件,动态加载提示符

    工作中用到 sqlplus mdsoss/mdsoss, 所以来了解一下sqlplus (C shell .cshrc文件里中alisa) 关于设置SQLPLUS提示符样式的方法 12638阅读 1评 ...

  4. apache 配置多个虚拟主机

    修改文件:httd.conf 文件地址:D:\wamp\bin\apache\Apache2.2.21\conf #配置虚拟主机<VirtualHost 127.0.0.3:80>Serv ...

  5. poj1142.Smith Number(数学推导)

    Smith Number Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 825  Solved: 366 Description While skimm ...

  6. js实现文本框限制输入数字和小数点--兼容多个浏览器

    <html> <head> <meta http-equiv="content-Type" content="text/html;chars ...

  7. 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.

    在网上看到过一个面试题,感觉挺有意思,看别人的代码写的逻辑不够谨慎,重写了一个,较真了又... package com.array7.algorithm; public class Algorithm ...

  8. 裸设备和Oracle问答20例

    导读裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备.裸设备可以绑定一个分区,也可以绑定一个磁盘.本文收集裸设备和Oracle问答20例. 1.什么叫 ...

  9. 白手起家搭建django app

    $django-admin.py startproject web2 $cd web2/ $python manage.py startapp blog $vim web2/settings.py 注 ...

  10. 暑假热身 D. 条形码设计

    校ACM队准备筹划向学校批请一个专用机房.但是为了防止它变成公用机房,FL建议采用刷卡进入的办法,她设计了一种条形码,每人都对应一个.这种大小为2*n的条形码由以下三种元素构成:1*2.2*1.2*2 ...