作者:被撑死的猫。。。 | 来源:互联网 | 2023-09-16 09:30
版权所有,转载请注明来自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>