热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android打开APN

版权所有,转载请注明来自MobileDeveloper(http:mdev.cc ) 作者 :SinFrancis 由于Android对于APN的网络API没有公开,不过我们可以阅

版权所有,转载请注明来自Mobile Developer (http://mdev.cc )  作者  : SinFrancis

 

由于Android对于APN的网络API没有公开,不过我们可以阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭APN。

 

大家可以研究一下frameworks/base/core/java/android/provider/Telephony.java这个类,

比较重要的就是 URI 和数据库字段: content://telephony/carriers

字段可以在Telephony.java中找到。

 

 

其实原理很简单 : 

1 、 当开启APN的时候,设置一个正确的移动或者联通的APN

2、 关闭的时候设置一个错误APN就会自动关闭网络

 

请看代码:Activity:

 

  1 package cc.mdev.apn;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import android.app.Activity;
  7 import android.content.ContentValues;
  8 import android.database.Cursor;
  9 import android.net.Uri;
 10 import android.os.Bundle;
 11 import android.util.Log;
 12 import android.view.View;
 13 import android.widget.Button;
 14 
 15 
 16 /**
 17  * 這裡是Activity
 18  * @author SinFrancis wong
 19  * @site http://mdev.cc
 20  * @wiki http://mdev.cc/wiki
 21  * @since 2010-01-08
 22  */
 23 public class Main extends Activity {
 24     /** Called when the activity is first created. */
 25     Uri uri = Uri.parse("content://telephony/carriers");
 26     @Override
 27     public void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.main);
 30         
 31         Button open= (Button) findViewById(R.id.open);
 32         Button close= (Button) findViewById(R.id.close);
 33         
 34         open.setOnClickListener(new View.OnClickListener() {
 35             
 36             @Override
 37             public void onClick(View v) {
 38                 openAPN();
 39             }
 40         });
 41         
 42         
 43         close.setOnClickListener(new View.OnClickListener() {
 44             
 45             @Override
 46             public void onClick(View v) {
 47                 closeAPN();
 48             }
 49         });
 50         
 51     }
 52     
 53     public  void openAPN(){
 54         
 55         List list = getAPNList();
 56         for (APN apn : list) {
 57             ContentValues cv = new ContentValues();
 58             cv.put("apn", APNMatchTools.matchAPN(apn.apn));
 59             cv.put("type", APNMatchTools.matchAPN(apn.type));
 60             getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id});
 61             
 62         }
 63     }
 64     
 65     public void closeAPN(){
 66         List list = getAPNList();
 67         for (APN apn : list) {
 68             ContentValues cv = new ContentValues();
 69             cv.put("apn", APNMatchTools.matchAPN(apn.apn)+"mdev");
 70             cv.put("type", APNMatchTools.matchAPN(apn.type)+"mdev");
 71             getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id});
 72             
 73         }
 74     }
 75     
 76     private List getAPNList(){
 77         String tag = "Main.getAPNList()";
 78         
 79         //current不为空表示可以使用的APN
 80         String  projection[] = {"_id,apn,type,current"};
 81         Cursor cr = this.getContentResolver().query(uri, projection, null, null, null);
 82         
 83         List list = new ArrayList();
 84         
 85         while(cr!=null && cr.moveToNext()){
 86             Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + "  " + cr.getString(cr.getColumnIndex("apn")) + "  " + cr.getString(cr.getColumnIndex("type"))+ "  " + cr.getString(cr.getColumnIndex("current")));
 87             APN a = new APN();
 88             a.id = cr.getString(cr.getColumnIndex("_id"));
 89             a.apn = cr.getString(cr.getColumnIndex("apn"));
 90             a.type = cr.getString(cr.getColumnIndex("type"));
 91             list.add(a);
 92         }
 93         if(cr!=null)
 94         cr.close();
 95         return list;
 96     }
 97     
 98     
 99     public static class APN{
100         String id;
101         String apn;
102         String type;
103     }
104     
105 }

 

APNMatchTools.java

 

View Code
 1 package cc.mdev.apn;
 2 
 3 
 4 
 5 /**
 6  * 這裡是APN匹配,用於匹配移動或者聯通的APN
 7  * @author SinFrancis wong
 8  * @site http://mdev.cc
 9  * @wiki http://mdev.cc/wiki
10  * @since 2010-01-08
11  *
12  */
13 public final class APNMatchTools {
14     
15     public static class APNNet{
16         /**
17          * 中国移动cmwap
18          */
19         public static String CMWAP = "cmwap";
20         
21         /**
22          * 中国移动cmnet
23          */
24         public static String CMNET = "cmnet";
25         
26         //中国联通3GWAP设置        中国联通3G因特网设置        中国联通WAP设置        中国联通因特网设置
27         //3gwap                 3gnet                uniwap            uninet
28         
29         
30         /**
31          * 3G wap 中国联通3gwap APN 
32          */
33         public static String GWAP_3 = "3gwap";
34         
35         /**
36          * 3G net 中国联通3gnet APN 
37          */
38         public static String GNET_3="3gnet";
39         
40         /**
41          * uni wap 中国联通uni wap APN 
42          */
43         public static String UNIWAP="uniwap";
44         /**
45          * uni net 中国联通uni net APN 
46          */
47         public static String UNINET="uninet";
48     }
49 
50 
51 
52     public static String matchAPN(String currentName) {        
53         if("".equals(currentName) || null==currentName){
54             return "";
55         }
56         currentName = currentName.toLowerCase();
57         if(currentName.startsWith(APNNet.CMNET))
58             return APNNet.CMNET;
59         else if(currentName.startsWith(APNNet.CMWAP))
60             return APNNet.CMWAP;
61         else if(currentName.startsWith(APNNet.GNET_3))
62             return APNNet.GNET_3;
63         else if(currentName.startsWith(APNNet.GWAP_3))
64             return APNNet.GWAP_3;
65         else if(currentName.startsWith(APNNet.UNINET))
66             return APNNet.UNINET;
67         else if(currentName.startsWith(APNNet.UNIWAP))
68             return APNNet.UNIWAP;
69         else if(currentName.startsWith("default"))
70             return "default";
71         else return "";
72        // return currentName.substring(0, currentName.length() - SUFFIX.length());
73     }
74     
75     
76 }

 最后不要忘记加上修改APN的权限:

1 <uses-permission android:name="android.permission.WRITE_APN_SETTINGS">uses-permission>

 

 

 


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了关于汉庭酒店价格的知识点,提供了一篇由congdi7904投稿的技术文章,希望能帮到读者解决相关技术问题。同时还提供了汉庭酒店的官方链接和转载信息。请注意,引用汉庭酒店需遵循CC 4.0 BY-SA版权协议。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
author-avatar
被撑死的猫。。。
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有