流量被关闭了怎么打开移动数据

9677人阅读
Android_网络应用(6)
开启和关闭移动数据网络有两种方法:一种是通过操作系统的数据库改变APN(网络接入点),从而实现开启和关闭移动数据网络,另一种是通过反射调用系统(ConnectivityManager)的setMoblieDataEnabled方法,通过操作该方法开启和关闭系统移动数据,同时也可以通过反射调用getMoblieDataEnabled方法获取当前的开启和关闭状态。
第一种方式:
&& 通过APN的方式开启和关闭很威猛啊,为什么这么说呢,废话不多说,先看代码:
&& 1. 匹配类:
&&public&final&class&APNMatchTools&&{&&&&&&&&&&&&&&public&static&String&CMWAP&=&&cmwap&;&&&&&&&&&&&&&&public&static&String&CMNET&=&&cmnet&;&&&&&&&&&&&&&&&&public&static&String&GWAP_3&=&&3gwap&;&&&&&&&&&&&&&&public&static&String&GNET_3&=&&3gnet&;&&&&&&&&&&&&&&public&static&String&UNIWAP&=&&uniwap&;&&&&&&&&&&&&&&public&static&String&UNINET&=&&uninet&;&&&&&&&&&&&&&&public&static&String&CTWAP&=&&ctwap&;&&&&&&&&&&&&&&public&static&String&CTNET&=&&ctnet&;&&&&&&&&public&static&String&matchAPN(String&currentName)&&&&&&{&&&&&&&&&&&&if&(&&.equals(currentName)&||&null&==&currentName)&&&&&&&&&&{&&&&&&&&&&&&&&&&return&&&;&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&currentName&=&currentName.toLowerCase();&&&&&&&&&&&&&&&&&&&&if&(currentName.startsWith(CMNET))&&&&&&&&&&&&&&return&CMNET;&&&&&&&&&&else&if&(currentName.startsWith(CMWAP))&&&&&&&&&&&&&&return&CMWAP;&&&&&&&&&&else&if&(currentName.startsWith(GNET_3))&&&&&&&&&&&&&&return&GNET_3;&&&&&&&&&&&&else&if&(currentName.startsWith(GWAP_3))&&&&&&&&&&&&&&return&GWAP_3;&&&&&&&&&&else&if&(currentName.startsWith(UNINET))&&&&&&&&&&&&&&return&UNINET;&&&&&&&&&&&&else&if&(currentName.startsWith(UNIWAP))&&&&&&&&&&&&&&return&UNIWAP;&&&&&&&&&&else&if&(currentName.startsWith(CTWAP))&&&&&&&&&&&&&&return&CTWAP;&&&&&&&&&&else&if&(currentName.startsWith(CTNET))&&&&&&&&&&&&&&return&CTNET;&&&&&&&&&&else&if&(currentName.startsWith(&default&))&&&&&&&&&&&&&&return&&default&;&&&&&&&&&&else&&&&&&&&&&&&&&return&&&;&&&&&&}&&&&}&&
2. 开启和关闭APN的方法在ApnSwitchTest类中实现,如下:
import&java.util.ArrayL&&import&java.util.L&&&&import&android.app.A&&import&android.content.ContentV&&import&android.database.C&&import&android.net.U&&import&android.util.L&&&&public&class&ApnSwitchTest&extends&Activity&&{&&&&&&&&Uri&uri&=&Uri.parse(&content://telephony/carriers/preferapn&);&&&&&&&&&&&&&&&&public&void&openAPN()&&&&&&{&&&&&&&&&&List&APN&&list&=&getAPNList();&&&&&&&&&&for&(APN&apn&:&list)&&&&&&&&&&{&&&&&&&&&&&&&&ContentValues&cv&=&new&ContentValues();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&cv.put(&apn&,&APNMatchTools.matchAPN(apn.apn));&&&&&&&&&&&&&&cv.put(&type&,&APNMatchTools.matchAPN(apn.type));&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&getContentResolver().update(uri,&cv,&&_id=?&,&new&String[]&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&apn.id&&&&&&&&&&&&&&});&&&&&&&&&&}&&&&&&&&}&&&&&&&&&&&&&&public&void&closeAPN()&&&&&&{&&&&&&&&&&List&APN&&list&=&getAPNList();&&&&&&&&&&for&(APN&apn&:&list)&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&ContentValues&cv&=&new&ContentValues();&&&&&&&&&&&&&&&&&&&&&&&&&&&&cv.put(&apn&,&APNMatchTools.matchAPN(apn.apn)&+&&close&);&&&&&&&&&&&&&&cv.put(&type&,&APNMatchTools.matchAPN(apn.type)&+&&close&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&getContentResolver().update(uri,&cv,&&_id=?&,&new&String[]&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&apn.id&&&&&&&&&&&&&&});&&&&&&&&&&}&&&&&&}&&&&&&&&&&&&public&static&class&APN&&&&&&{&&&&&&&&&&String&&&&&&&&&&&&&String&&&&&&&&&&&&&String&&&&&&&}&&&&&&&&private&List&APN&&getAPNList()&&&&&&{&&&&&&&&&&&&&&&&&&&&String&projection[]&=&&&&&&&&&&{&&&&&&&&&&&&&&&_id,&apn,&type,&current&&&&&&&&&&&};&&&&&&&&&&&&&&&&&&&&Cursor&cr&=&getContentResolver().query(uri,&projection,&null,&null,&null);&&&&&&&&&&&&&&&&&&&&&&List&APN&&list&=&new&ArrayList&APN&();&&&&&&&&&&&&while&(cr&!=&null&&&&cr.moveToNext())&&&&&&&&&&{&&&&&&&&&&&&&&&&Log.d(&ApnSwitch&,&&id&&+&cr.getString(cr.getColumnIndex(&_id&))&+&&&\n&&+&&apn&&&&&&&&&&&&&&&&&&&&&&&+&cr.getString(cr.getColumnIndex(&apn&))&+&&\n&&+&&type&&&&&&&&&&&&&&&&&&&&&&&+&cr.getString(cr.getColumnIndex(&type&))&+&&\n&&+&&current&&&&&&&&&&&&&&&&&&&&&&&+&cr.getString(cr.getColumnIndex(&current&)));&&&&&&&&&&&&&&&&APN&a&=&new&APN();&&&&&&&&&&&&&&&&a.id&=&cr.getString(cr.getColumnIndex(&_id&));&&&&&&&&&&&&&&a.apn&=&cr.getString(cr.getColumnIndex(&apn&));&&&&&&&&&&&&&&a.type&=&cr.getString(cr.getColumnIndex(&type&));&&&&&&&&&&&&&&list.add(a);&&&&&&&&&&}&&&&&&&&&&&&if&(cr&!=&null)&&&&&&&&&&&&&&cr.close();&&&&&&&&&&&&return&&&&&&&}&&&&}&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有关反射的知识的,或者是忘了的,可以去学习和温习一下)。
* 设置手机的移动数据
public static void setMobileData(Context pContext, boolean pBoolean) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) pContext.getSystemService(Context.CONNECTIVITY_SERVICE);
Class ownerClass = mConnectivityManager.getClass();
Class[] argsClass = new Class[1];
argsClass[0] = boolean.
Method method = ownerClass.getMethod(&setMobileDataEnabled&, argsClass);
method.invoke(mConnectivityManager, pBoolean);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(&移动数据设置错误: & + e.toString());
* 返回手机移动数据的状态
* @param pContext
* @param arg
默认填null
* @return true 连接 false 未连接
public static boolean getMobileDataState(Context pContext, Object[] arg) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) pContext.getSystemService(Context.CONNECTIVITY_SERVICE);
Class ownerClass = mConnectivityManager.getClass();
Class[] argsClass =
if (arg != null) {
argsClass = new Class[1];
argsClass[0] = arg.getClass();
Method method = ownerClass.getMethod(&getMobileDataEnabled&, argsClass);
Boolean isOpen = (Boolean) method.invoke(mConnectivityManager, arg);
return isO
} catch (Exception e) {
// TODO: handle exception
System.out.println(&得到移动数据状态出错&);
最后,别忘了在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)方法返回的布尔值判断当移动数据网络前状态的开启和关闭。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:157623次
积分:1797
积分:1797
排名:千里之外
原创:40篇
转载:51篇
评论:26条
(3)(5)(6)(7)(10)(3)(3)(1)(1)(2)(1)(3)(1)(9)(13)(12)(4)(7)当前位置:
全球都在关闭2G网络 中国移动为什么反其道而行之关3G?
随着4G的普及,越来越多的手机用户从3G换成了4G。而要说三大运营商中4G发展最好的,当属财大气粗的中国移动。由于工信部提前发放TD-LTE牌照,中国移动的4G用户在短短2年的时间内突破了3.3个亿。
  OFweek网讯 随着4G的普及,越来越多的手机用户从3G换成了4G。而要说三大运营商中4G发展最好的,当属财大气粗的中国移动。由于工信部提前发放TD-LTE牌照,中国移动的4G用户在短短2年的时间内突破了3.3个亿。而这一数字不仅把竞争对手们远远甩在身后,也使移动彻底甩掉了3G时代&网速慢终端少&的包袱。  伴随着4G用户的快速增长,中国移动的3G用户数也开始大幅下跌。根据公开的数据,截止2016年1月中国移动的3G用户数仅为1.63亿户,而3G网络上所承载的流量更是不到总流量的20%。随着3G网络重要性的下降,移动计划关停低流量TD-SCDMA基站的消息也在网上流传。换句话说,号称自主知识产权的TD-SCDMA可能比GSM更早退出历史舞台。  关停2G网已成国际主流  实际上,运营商关闭某张通信网络的情况并不罕见。从1991年开始,以GSM为主的2G网络开始在全球范围内广泛部署。作为一种通信标准,GSM本是为解决通话需求所设计的。但是随着互联网的蓬勃发展,人们对数据业务的需求开始不断增加,而GSM网络并不能满足这样的需求。不仅如此,GSM还存在着安全方面的问题,利用GSM漏洞的伪基站更是垃圾短信的主要来源。为了彻底解决这些问题,全球绝大部分运营商在部署3G网络后,都在尽力将2G用户向3G迁移。  时至今日,全球绝大部分运营商的3G网络都已部署超过10年的时间,单纯的2G用户已是寥寥无几。而比3G更早部署的GSM设备更是老旧不堪,选择退网也是理所当然。实际上,包括美国、新加坡、澳大利亚、澳门在内多个国家和地区的运营商都已经宣布在2017年前关闭GSM网络,尽快关闭老旧不堪的2G网络也已成为全球多数运营商的共识。  中移动为何反其道而行之?  既然全球大部分运营商都选择尽快关闭2G网络,为什么中移动偏偏反其道而行之,选择关闭更加先进的3G网络呢?实际上由于迟迟不发3G牌照,中国移动绝大部分用户依旧使用的是2G网络。即使是获得了TD-SCDMA制式的3G牌照,&网速慢终端差&依旧是困扰移动一大问题。而TD-SCDMA的缺陷也使人们对移动3G敬而远之,大量移动用户宁愿使用速率更慢的EDGE也不肯换成TD-SCDMA,TD-SCDMA网络的使用负荷更是远远不如GSM。  为了解决这一问题,财大气粗的中移动想尽了各种办法。一方面,移动投入巨资在全国范围建设了上百万个Wi-Fi热点。而这些Wi-Fi热点的推出,也的确为2G网络居高不下的数据压力起到了分流的作用。另一方面,移动以&自主知识产权&的名义在全国范围内建设了大批TD-LTE试验网。为了扶持&自主知识产权&的4G标准,工信部更是早早发放了TD-LTE牌照。有了牌照和网络的支持,移动开始将用户大举迁移至4G网络上。有了4G和Wi-Fi的分流,TD-SCDMA网络的用户数也是大幅下降,不少地区TD-SCDMA基站的日均流量甚至不到100MB。  随着TD-LTE基站的广泛部署,中国移动4G网络的覆盖水平已经超过了当初的TD-SCDMA。而4G手机的普及更是让用户数快速增长,3G网络所承载的流量也是越来越少。而在全国范围内运营2G、3G、4G三张网络,成本自然是居高不下。而关闭日均流量较低的TD-SCDMA基站,不仅可以降低网络的运营成本,同时还可以将TD-SCDMA的频率重用于TD-LTE的部署。对于移动来说,TD-SCDMA已经结束了它的历史使命,尽快关闭已是必然。而3G网络的关闭,不仅可以降低成本,还可以促进用户向4G迁移,进而带动流量的使用,可以说是一举多得。
责任编辑:Trista
免责声明:
本文仅代表作者个人观点,与
OFweek电子工程网
无关。其原创性以及文中陈述文字和内容未经本站证实,
对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅
作参考,并请自行核实相关内容。
邮箱/用户名:
忘记密码?
用其他账号登录: QQ
请输入评论
广东省/深圳市
四川省/成都市
广东省/深圳市
广东省/深圳市
广东省/深圳市
广东省/深圳市
北京市/海淀区
广东省/深圳市
广东省/深圳市
广东省/惠州市
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:}

我要回帖

更多关于 移动怎么取消上网功能 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信