什么是APN?
APN(Access Point Name)中文全称叫接入点。APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。APN用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。
APN手机里的位置
不同手机可能位置不一样,我使用的测试机是红米3S,位置是:设置->双卡和移动网络->接入点名称。或者可以直接在设置里直接搜索“APN”。我是在测试的时候才需要来这里看动态添加APN是否成功。
这里需要提前说明,代码实现设置APN需要程序拥有系统权限,如何拥有系统权限呢?你需要去找个工具给自己用AS build的apk进行系统签名,这种系统签名工具我之前在CSDM上看到过,如果需要的话可以去搜一下。另一点就是需要SIM卡,如果测试机没有SIM卡的话就没办法进行这方面的测试了。
Android系统中,对于APN网络的API是隐藏的,因此获取手机的APN设置,需要通过ContentProvider来进行数据库查询,查询的URI地址是:
取得全部的APN列表:content://telephony/carriers;
取得当前设置的APN:content://telephony/carriers/preferapn;
取得current=1的APN:content://telephony/carriers/current;
下面是代码实现简单介绍:
通过cr这个游标对象可以进行手机里面APN信息的查询,下面代码中的“ErrorApplication.getContext()”其实只是一个context对象,我实际代码中是这样写,把它换成其他合适的this或者你需要的context对象都可以。
// 检查当前连接的APN
Cursor cr = ErrorApplication.getContext().getContentResolver().query(APN_URI, null, null, null, null);
while (cr != null && cr.moveToNext()) {
if(cr.getString(cr.getColumnIndex("apn")).equals("abc")){
APN.hasAPN=true;
break;
}
}
}
获取SIM卡信息:APN中的某些属性在这些信息里面
protected String getSIMInfo() {
TelephonyManager iPhoneManager = (TelephonyManager) ErrorApplication.getContext()
.getSystemService(Context.TELEPHONY_SERVICE);
return iPhoneManager.getSimOperator();
}
添加接入点:
public int addAPN() {
int id = -1;
String NUMERIC = getSIMInfo();
if (NUMERIC == null) {
return -1;
}
ContentResolver resolver = ErrorApplication.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "专用APN"); //apn中文描述
values.put("apn", "unim2m.njm2mapn1"); //apn名称
values.put("type", "default"); //apn类型
values.put("numeric", NUMERIC);
values.put("mcc", NUMERIC.substring(0, 3));
values.put("mnc", NUMERIC.substring(3, NUMERIC.length()));
values.put("proxy", ""); //代理
values.put("port", ""); //端口
values.put("mmsproxy", ""); //彩信代理
values.put("mmsport", ""); //彩信端口
values.put("user", ""); //用户名
values.put("server", ""); //服务器
values.put("password", ""); //密码
values.put("mmsc"<