android 打开APN

版权所有,转载请注明来自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<APN> 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<APN> 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<APN> 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<APN> list = new ArrayList<APN>();
 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>

 

 

 

posted @ 2012-04-30 13:16  fg0711  阅读(771)  评论(0编辑  收藏  举报