最近做个项目需要应用开始打开专网apn,退出时连接之前apn。
apn在4.0之后取消了,android:name="android.permission.WRITE_APN_SETTINGS"权限。
所以目前只能用在4.0一下。
1.获取apn所有列表和当前连接的apn的信息。 2.添加自定义apn 3.连接指定apn 4.删除指定apn
自定义的APN类。
public class APN{
public String id;
public String apn;
public String type;
}
1.第一步 获取apn列表,数据库存储路径。
1. private static Uri APN_LIST_URI = Uri.parse("content://telephony/carriers");// 所有APN列表资源
2. //默认APN,也就是当前选中的apn
private static Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");
2.获取所有apn列表和获取当前apn列表方法时相同的,只是路径不同,只要换不同的 Uri就可以了。
获取当前apn信息:
/*
* 获取当前APN信息
* (non-Javadoc)
* @see android.app.Activity#onDestroy()
*/
public List<APN> getnowAPNList()
{
String tag = "Main.getAPNList()";
//current不为空表示可以使用的APN
String projection[] = {"_id,apn,type,current"};
Cursor cr = this.getContentResolver().query(PREFERRED_APN_URI, projection, null, null, null);
List<APN> list = new ArrayList<APN>();
while(cr!=null && cr.moveToNext())
{
APN a = new APN(context);
a.id = cr.getString(cr.getColumnIndex("_id"));
a.apn = cr.getString(cr.getColumnIndex("apn"));
a.type = cr.getString(cr.getColumnIndex("type"));
Log.i("id#", a.id+"");
Log.i("apn#", a.apn+"");
Log.i("type#", a.type+"");
list.add(a); // 添加到APN列表
}
if(cr!=null)
cr.close();
return list; //返回APN列表
}
3. 添加自定义的APN。
/*
* 添加新的 vpn
*
*/
public int AddXFTApn() {
Log.i("添加apn", "添加apn");
TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String NUMERIC = telephonyManager.getSimOperator();
ContentValues values = new ContentValues();//APN参数
values.put("name","专网APN"); //apn中文描述
values.put("apn", "TEXT"); //设置APN接入点
values.put("type", "default");//类型默认
values.put("numeric", NUMERIC);
values.put("mcc", NUMERIC.substring(0, 3));
values.put("mnc", NUMERIC.substring(3));
values.put("proxy", "");//APN代理
values.put("port", "");
values.put("mmsproxy", "");
values.put("mmsport", "");
values.put("user", "");//用户一般不设置
values.put("server", "");//
values.put("password", "");//一般不设置
values.put("mmsc", "");
Uri insertUri=getContentResolver().insert(Uri.parse("content://telephony/carriers"), values);
Cursor cr = getContentResolver().query(Uri.parse("content://telephony/carriers/"), null, null, null, null);
while (cr != null && cr.moveToNext())
{
String name = cr.getString(cr.getColumnIndex("name"));
System.out.println("name:" + name);
}
cr.close();
String new_apn_id = insertUri.getPathSegments().get(1); //获取刚刚添加的APN的ID
ContentValues valuesUpdate = new ContentValues();
valuesUpdate.put("apn_id", new_apn_id);
//设置默认APN:就是将默认的ID改为刚刚添加的apn的ID //将当前apn数据,设置为新添加的apn
getContentResolver().update(Uri.parse("content://telephony/carriers/preferapn"), valuesUpdate,null,null);
return apnid;
}
4. 按照apn接入点名称连接apn
/*
*
* APN连接
*
*/
public int updateCurrentAPN(String newAPN) {
Cursor cursor = null;
ContentResolver resolver = getContentResolver();
//get new apn id from list
cursor = resolver.query(APN_LIST_URI, null, "apn=?", new String[]{newAPN.toLowerCase()}, null);
String apnId = null;
Log.i("开始连接数据3", "updateCurrentAPN begin");
if (cursor != null && cursor.moveToFirst())
{
apnId = cursor.getString(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
Log.i("apnId", "curApnIdd ="+apnId);
Log.i("name",name);
}
cursor.close();
if (apnId != null)
{
ContentValues values = new ContentValues();
values.put("apn_id", apnId);
int result = resolver.update(PREFERRED_APN_URI, values, null, null);
Cursor c = resolver.query(PREFERRED_APN_URI, new String[] { "name", "apn" }, "_id=?", new String[]{apnId}, null);
if (c != null)
{
c.close();
}
}
else
{
Log.i("连接失败", "不存在");
return 0;
}
//update success
return 1;
}
5. 删除指定的 apn
/*
* 删除指定的apn
* (non-Javadoc)
* @see android.app.Activity#onDestroy()
*/
public void delete(String apnname){
Uri uri = Uri.parse("content://telephony/carriers");
Cursor cr = getContentResolver().query(uri, null, null, null, null);
while(cr!=null && cr.moveToNext()){
// APN id
String id = cr.getString(cr.getColumnIndex("_id"));
// APN name
String apn = cr.getString(cr.getColumnIndex("apn"));
if(apn.equals(apnname)){
//不知道什么原因,直接按照apn接入点删除出错,但是用apnid可以正常删除
this.getContentResolver().delete(uri,"_id="+id, null);
}
}
}