热门标签 | 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>

 

 

 


推荐阅读
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • Android 开发技巧:使用 AsyncTask 实现后台任务与 UI 交互
    本文详细介绍了如何在 Android 应用中利用 AsyncTask 来执行后台任务,并及时将任务进展反馈给用户界面,提高用户体验。 ... [详细]
  • IntelliJ IDEA配置微服务启动显示
    通过编辑IntelliJ IDEA的workspace.xml文件,可以实现微服务启动对象的显示。具体步骤包括定位并修改workspace.xml中的RunDashboard部分。 ... [详细]
  • 本文详细探讨了编程中的命名空间与作用域概念,包括其定义、类型以及在不同上下文中的应用。 ... [详细]
  • 宝塔面板下启用HTTPS的详细指南
    本文提供了在宝塔面板环境中配置HTTPS的具体步骤,确保您的网站通信更加安全可靠。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • Adversarial Personalized Ranking for Recommendation
    目录概主要内容基础对抗扰动对抗训练细节代码HeX.,HeZ.,DuX.andChuaT.Adversarialpersonalizedrankingforrecommendatio ... [详细]
  • 本文详细介绍了如何在PyQt5中创建简易对话框,包括对话框的基本结构、布局管理以及源代码实现。通过实例代码,展示了如何设置窗口部件、布局方式及对话框的基本操作。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • UVa 11683: 激光雕刻技术解析
    自1958年发明以来,激光技术已在众多领域得到广泛应用,包括电子设备、医疗手术工具、武器等。本文将探讨如何使用激光技术进行材料雕刻,并通过编程解决一个具体的激光雕刻问题。 ... [详细]
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社区 版权所有