开启和关闭移动数据网络有两种方法:一种是通过操作系统的数据库改变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. title及alt提示特效

    <html> <head> <title>title及alt提示特效</title> <style type="text/css&quo ...

  2. [Angularjs]ng-switch用法

    用法描述 ng-switch根据表达式的值显示或这隐藏对应部分.类似c#或者其他预览里面的switch用法.可以慢慢体会. 说道ng-switch就要说到子元素该怎么根据当前值进行变化.子元素可以通过 ...

  3. .NET深入实战系列--EF到底怎么写过滤条件(转)

    原文来自:http://www.cnblogs.com/yubaolee/p/DynamicLinq.html 对于系统开发来说,按不同字段进行过滤查询是一种常见的需求.在EF中通常的做法是: /// ...

  4. Flume-NG内置计数器(监控)源码级分析

    Flume的内置监控怎么整?这个问题有很多人问.目前了解到的信息是可以使用Cloudera Manager.Ganglia有图形的监控工具,以及从浏览器获取json串,或者自定义向其他监控系统汇报信息 ...

  5. 如何将北京时间批量转为Unix时间?用Excel!

    前面我们说过Unix时间戳转换怎样在Excel批量修改,有些人就想如果有特殊需求,那能不能批量将北京时间批量转成unix时间呢?能!用Excel就可以实现!跟ytkah一起试试吧. 将unix时间戳转 ...

  6. cocos基础教程(2)Window环境下搭建(补充)

    一.环境搭建 1.JDK.Eclipse与SDK 我用的JDK是1.7 Eclipse用的是Luna版的 这些之前都已经设好了,相关下载自己网上找吧 2. 下载最新的Cocos2d-x,我下的是3.5 ...

  7. php面试题之四——Linux部分(高级部分)

    四.Linux部分 1.请解释下列10个shell命令的用途(新浪网技术部) top.ps.mv.find.df.cat.chmod.chgrp.grep.wc top:该命令提供了实时对系统处理器状 ...

  8. Leetcode 之Convert Sorted List to Binary Search Tree(55)

    和上题思路基本一致,不同的地方在于,链表不能随机访问中间元素. int listLength(ListNode* node) { ; while (node) { n++; node = node-& ...

  9. HDU 1069&&HDU 1087 (DP 最长序列之和)

    H - Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  10. Linux tar命令exclude选项排除指定文件或目录

    在linux中可以用tar打包目录以方便传输or备份,我们先来看一个例子 test 文件夹有如下文件 [root@lee ~]# ll test 总用量 -rw-r--r--. root root 4 ...