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

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

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

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

其实原理很简单 :

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

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

请看代码:Activity:

package cc.mdev.apn;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;/** * 這裡是Activity * @author SinFrancis wong * @site http://mdev.cc * @wiki http://mdev.cc/wiki * @since 2010-01-08 */public class Main extends Activity {    /** Called when the activity is first created. */Uri uri = Uri.parse("content://telephony/carriers");    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                Button open= (Button) findViewById(R.id.open);        Button close= (Button) findViewById(R.id.close);                open.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {openAPN();}});                        close.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {closeAPN();}});            }        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)+"mdev");    cv.put("type", APNMatchTools.matchAPN(apn.type)+"mdev");    getContentResolver().update(uri, cv, "_id=?", new String[]{apn.id});    }    }        private List<APN> getAPNList(){    String tag = "Main.getAPNList()";        //current不为空表示可以使用的APN    String  projection[] = {"_id,apn,type,current"};    Cursor cr = this.getContentResolver().query(uri, projection, null, null, null);        List<APN> list = new ArrayList<APN>();        while(cr!=null && cr.moveToNext()){    Log.d(tag, cr.getString(cr.getColumnIndex("_id")) + "  " + cr.getString(cr.getColumnIndex("apn")) + "  " + cr.getString(cr.getColumnIndex("type"))+ "  " + 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 list;    }            public static class APN{    String id;    String apn;    String type;    }    }

APNMatchTools.java

package cc.mdev.apn;/** * 這裡是APN匹配,用於匹配移動或者聯通的APN * @author SinFrancis wong * @site http://mdev.cc * @wiki http://mdev.cc/wiki * @since 2010-01-08 * */public final class APNMatchTools {public static class APNNet{/** * 中国移动cmwap */public static String CMWAP = "cmwap";/** * 中国移动cmnet */public static String CMNET = "cmnet";//中国联通3GWAP设置        中国联通3G因特网设置        中国联通WAP设置        中国联通因特网设置//3gwap                 3gnet                uniwap            uninet/** * 3G wap 中国联通3gwap APN  */public static String GWAP_3 = "3gwap";/** * 3G net 中国联通3gnet APN  */public static String GNET_3="3gnet";/** * uni wap 中国联通uni wap APN  */public static String UNIWAP="uniwap";/** * uni net 中国联通uni net APN  */public static String UNINET="uninet";}    public static String matchAPN(String currentName) {            if("".equals(currentName) || null==currentName){    return "";    }    currentName = currentName.toLowerCase();    if(currentName.startsWith(APNNet.CMNET))    return APNNet.CMNET;    else if(currentName.startsWith(APNNet.CMWAP))    return APNNet.CMWAP;    else if(currentName.startsWith(APNNet.GNET_3))    return APNNet.GNET_3;    else if(currentName.startsWith(APNNet.GWAP_3))    return APNNet.GWAP_3;    else if(currentName.startsWith(APNNet.UNINET))    return APNNet.UNINET;    else if(currentName.startsWith(APNNet.UNIWAP))    return APNNet.UNIWAP;    else if(currentName.startsWith("default"))    return "default";    else return "";       // return currentName.substring(0, currentName.length() - SUFFIX.length());    }        }

APN权限

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

更多相关文章

  1. android通过php连接mysql数据库!!!!
  2. 在Android中把SQLite的数据库文件存储在SD卡中【转】
  3. android数据库操作(二)
  4. Android如何导入已有的外部数据库
  5. SQlite Android 数据库应用程序系统
  6. android 通知 手机 媒体 数据库 更新
  7. 获得android下面,所有的数据库
  8. android的数据库API操作
  9. 优雅的处理Android数据库升级的问题

随机推荐

  1. android线程相关2
  2. 【Geek】Android(安卓)将代码打包成JAR时
  3. 安全篇 - 隐式配置 KeyStore 签名信息
  4. Android(安卓)启动服务配合AsyncTask 使
  5. 关于APP接收开机广播延迟问题,解决开机启
  6. android 如何终止线程
  7. 基于Android的英文电子词典
  8. Android应用进程内存管理
  9. Android(安卓)Camera生成bmp格式的图片
  10. Android(安卓)网络状态监听那些事