package edu.hebtu.movingcampus.utils;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.telephony.TelephonyManager;
import android.util.Log;
/**
* 这个类是否有必要
*
* @author mingxv
*
*/
public class APNManager {
private ContentResolver resolver;
private static final Uri PREFERRED_APN_URI = Uri
.parse("content://telephony/carriers/preferapn");
private static final Uri APN_TABLE_URI = Uri
.parse("content://telephony/carriers");
private TelephonyManager tm;
private Context mContext;
private static APNManager apnManager = null;
public static APNManager getInstance(Context context) {
if (apnManager != null) {
apnManager = new APNManager(context);
}
return apnManager;
}
private APNManager(Context context) {
resolver = context.getContentResolver();
mContext = context;
tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
}
/**
* 判断一个apn是否存在 存在返回id
*
* @param apnNode
* @return
*/
public int isApnExisted(APN apnNode) {
int apnId = -1;
Cursor mCursor = resolver.query(APN_TABLE_URI, null, null, null, null);
while (mCursor != null && mCursor.moveToNext()) {
apnId = mCursor.getShort(mCursor.getColumnIndex("_id"));
String name = mCursor.getString(mCursor.getColumnIndex("name"));
String apn = mCursor.getString(mCursor.getColumnIndex("apn"));
String type = mCursor.getString(mCursor.getColumnIndex("type"));
String proxy = mCursor.getString(mCursor.getColumnIndex("proxy"));
String port = mCursor.getString(mCursor.getColumnIndex("port"));
String current = mCursor.getString(mCursor
.getColumnIndex("current"));
String mcc = mCursor.getString(mCursor.getColumnIndex("mcc"));
String mnc = mCursor.getString(mCursor.getColumnIndex("mnc"));
String numeric = mCursor.getString(mCursor
.getColumnIndex("numeric"));
LogUtil.e("isApnExisted", "info:" + apnId + "_" + name + "_" + apn
+ "_" + type + "_" + current + "_" + proxy);// 遍历了所有的apn
if (/* apnNode.getName().equals(name) */(apnNode.getApn().equals(
apn)
&& apnNode.getMcc().equals(mcc)
&& apnNode.getMnc().equals(mnc) && apnNode.getNumeric()
.equals(numeric))
&& (type == null || "default".equals(type) || ""
.equals(type)))// || (apnNode.getApn().equals(apn)
// && "".equals(proxy) &&
// "".equals(port))
{
return apnId;
} else {
apnId = -1;
}
}
return apnId;
}
/**
* 设置默认的apn
*
* @param apnId
* @return
*/
public boolean setDefaultApn(int apnId) {
boolean res = false;
ContentValues values = 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) {
e.printStackTrace();
}
return res;
}
/**
* 删除所有apn
*/
public void deleteApn() {
resolver.delete(APN_TABLE_URI, null, null);
}
public APN getDefaultAPN() {
String id = "";
String apn = "";
String proxy = "";
String name = "";
String port = "";
String type = "";
String mcc = "";
String mnc = "";
String numeric = "";
APN apnNode = new APN();
Cursor mCursor = resolver.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"));
LogUtil.d("getDefaultAPN", "default Apn info:" + id + "_" + name + "_"
+ apn + "_" + proxy + "_" + proxy);
}
apnNode.setName(name);
apnNode.setApn(apn);
apnNode.setProxy(proxy);
apnNode.setPort(port);
apnNode.setMcc(mcc);
apnNode.setMnc(mnc);
apnNode.setNumeric(numeric);
return apnNode;
}
public int getDefaultNetworkType() {
int networkType = -1;
ConnectivityManager connectivity = (ConnectivityManager) mContext
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
} else {
// wifi network have priority
NetworkInfo wifiNetworkInfo = connectivity
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiNetworkInfo != null
&& wifiNetworkInfo.getState() == NetworkInfo.State.CONNECTED) {
return ConnectivityManager.TYPE_WIFI;
}
NetworkInfo[] info = connectivity.getAllNetworkInfo();
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
// use first available network
networkType = info[i].getType();
break;
}
}
}
return networkType;
}
// 添加一个APN
public int InsetAPN() {
APN checkApn = new APN();
checkApn.setName("爱家物联专用接口");
checkApn.setApn("ctnet");
// checkApn.setProxy("10.0.0.200");
// checkApn.setPort("80");
checkApn.setUser("qdaj@qdaj.vpdn.sd");
checkApn.setPassword("123456");
checkApn.setMcc(getMCC());
checkApn.setMnc(getMNC());
checkApn.setNumeric(getSimOperator());
return addNewApn(checkApn);
}
/**
* 增加新的apn
*
* @param apnNode
* @return
*/
private int addNewApn(APN apnNode) {
int apnId = -1;
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);
LogUtil.d("Robert", "New ID: " + apnId
+ ": Inserting new APN succeeded!");
}
} catch (SQLException e) {
e.printStackTrace();
}
if (c != null)
c.close();
return apnId;
}
private String getMCC() {
String numeric = tm.getSimOperator();
String mcc = numeric.substring(0, 3);
LogUtil.i("MCC is", mcc);
return mcc;
}
private String getMNC() {
String numeric = tm.getSimOperator();
String mnc = numeric.substring(3, numeric.length());
LogUtil.i("MNC is", mnc);
return mnc;
}
private String getSimOperator() {
String SimOperator = tm.getSimOperator();
return SimOperator;
}
public String matchAPN(String currentName) {
if ("".equals(currentName) || null == currentName) {
return "";
}
currentName = currentName.toLowerCase();
if (currentName.startsWith("cmnet") || currentName.startsWith("CMNET"))
return "cmnet";
else if (currentName.startsWith("cmwap")
|| currentName.startsWith("CMWAP"))
return "cmwap";
else if (currentName.startsWith("3gwap")
|| currentName.startsWith("3GWAP"))
return "3gwap";
else if (currentName.startsWith("3gnet")
|| currentName.startsWith("3GNET"))
return "3gnet";
else if (currentName.startsWith("uninet")
|| currentName.startsWith("UNINET"))
return "uninet";
else if (currentName.startsWith("uniwap")
|| currentName.startsWith("UNIWAP"))
return "uniwap";
else if (currentName.startsWith("default")
|| currentName.startsWith("DEFAULT"))
return "default";
else
return "";
}
/**
* 获取Apn列表
*
* @param context
* @return
*/
public List<APN> getAPNList() {
String tag = "Main.getAPNList()";
String projection[] = { "_id,apn,type,current" };
Cursor cr = mContext.getContentResolver().query(APN_TABLE_URI,
projection, null, null, null);
List<APN> list = new ArrayList<APN>();
while (cr != null && cr.moveToNext()) {
LogUtil.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.apnId = 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;
}
}