Android apn網絡接入點的管理數據庫
這個月在作手機適配的時候有遇到這樣的狀況,當手機的apn接入點選擇wap的時候機器鏈接不上網絡,但當接入點設置爲net的時候就能夠.依據coopad方面提供的解決方案和研究了電信的apn策略以後,在程序中添加對手機接入點的判斷,如若當前軟件不能訪問網絡就對接入點類型進行判斷,如是wap,那有彈出提示是否要切換apn接入點,當用戶選擇了須要切換接入點時,先將原有的接入點保存起來,待用戶退出軟件後再還原.網絡
1. apn接入點的管理oop
對apn的管理,無非就是可以查詢apn,添加apn,修改apn和刪除apn.對apn的查詢有2中方式,一種是經過ConnectivityManager,另外一種是直接訪問數據庫來查詢.this
1) 經過ConnectivityManager查詢apnspa
Context context = mActivity.getApplicationContext();orm
ConnectivityManager connectivity = server
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);ci
NetworkInfo[] info = connectivity.getAllNetworkInfo();get
如此info中就可獲取當前全部的apn的信息.it
2) 直接訪問數據庫來查詢
直接訪問’content://telephony/carriers/preferapn’數據庫,並對其查詢集進行遍歷
private static final Uri PREFERRED_APN_URI =
Uri.parse("content://telephony/carriers/preferapn");
public ApnNode getDefaultAPN() {
String id = "";
String apn = "";
String proxy = "";
String name = "";
String port = "";
String type = "";
String mcc = "";
String mnc = "";
String numeric = "";
ApnNode apnNode = new ApnNode();
// Uri uri = Uri.parse("content://telephony/carriers/preferapn");
Cursor mCursor = getContentResolver().query(PREFERRED_APN_URI, null,null, null, null);
if (mCursor == null) {
// throw new Exception("Non prefer apn exist");
return null;
}
while (mCursor != null && mCursor.moveToNext()) {
id = mCursor.getString(mCursor.getColumnIndex("_id"));
name = mCursor.getString(mCursor.getColumnIndex("name"));
apn = mCursor.getString(mCursor.getColumnIndex("apn")).toLowerCase();
proxy = mCursor.getString(mCursor.getColumnIndex("proxy"));
port = mCursor.getString(mCursor.getColumnIndex("port"));
mcc = mCursor.getString(mCursor.getColumnIndex("mcc"));
mnc = mCursor.getString(mCursor.getColumnIndex("mnc"));
numeric = mCursor.getString(mCursor.getColumnIndex("numeric"));
Log.d("getDefaultAPN", "default Apn info:" + id + "_" + name + "_" + apn + "_" + proxy + "_" + proxy);
}
phoneSettedApnID = Integer.valueOf(id);
apnNode.setName(name);
apnNode.setApn(apn);
apnNode.setProxy(proxy);
apnNode.setPort(port);
apnNode.setMcc(mcc);
apnNode.setMnc(mnc);
apnNode.setNumeric(numeric);
return apnNode;
}
public class ApnNode {
private String _id;
private String name;
private String numeric;
private String mcc;
private String mnc;
private String apn;
private String user;
private String server;
private String password;
private String proxy;
private String port;
private String mmsproxy;
private String mmsport;
private String mmsc;
private String authtype;
private String type;
private String current;
private String isDefault;
private String dialnumber;
//setter…
//gettet…
}
3) 添加apn
public int addNewApn(ApnNode apnNode) {
int apnId = -1;
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put("name", apnNode.getName());
values.put("apn", apnNode.getApn());
values.put("proxy", apnNode.getProxy());
values.put("port", apnNode.getPort());
values.put("user", apnNode.getUser());
values.put("password", apnNode.getPassword());
values.put("mcc", apnNode.getMcc());
values.put("mnc", apnNode.getMnc());
values.put("numeric", apnNode.getNumeric());
// Note: this values need to be update, and for now, it only for XT800.
Cursor c = null;
try {
Uri newRow = resolver.insert(APN_TABLE_URI, values);
if (newRow != null) {
c = resolver.query(newRow, null, null, null, null);
int idindex = c.getColumnIndex("_id");
c.moveToFirst();
apnId = c.getShort(idindex);
Log.d("Robert", "New ID: " + apnId
+": Inserting new APN succeeded!");
}
}catch (SQLException e) {
}
if (c != null)
c.close();
return apnId;
}
4) 修改apn
ContentResolver resolver = getContentResolver();
ContentValuesvalues = new ContentValues();
values.put("apn_id", apnId);
try {
resolver.update(PREFERRED_APN_URI, values, null, null);
Cursor c = resolver.query(PREFERRED_APN_URI, new String[] { "name","apn" }, "_id=" + apnId, null, null);
if (c != null) {
res = true;
c.close();
}
}catch (SQLException e) {
}
5) 刪除apn
ContentResolver resolver = getContentResolver();
ContentValuesvalues = new ContentValues();
values.put("apn_id", apnId);
try {
resolver.delete
(PREFERRED_APN_URI, new String[] { "apn" }, "_id=" + apnId, null, null);
if (c != null) {
res = true;
c.close();
}
}catch (SQLException e) {
}
6) 判斷是不是wap類型
private boolean isCmwap() {
int net_type = getNetWorkType();
if (net_type == ConnectivityManager.TYPE_MOBILE) {
return isCurretApn();
} else if (net_type == ConnectivityManager.TYPE_WIFI) {
return false;
}
return false;
}
private int getNetWorkType() {
if (getConnectManager() != null) {
NetworkInfo networkInfo = getConnectManager().getActiveNetworkInfo();
if (networkInfo != null)
return networkInfo.getType();
return -1;
} else {
return -1;
}
}