Android学习之网络APN接入点控制
这几天工作中遇到了这样一个问题:应用是一个和平台端系统通过webservice对接的客户端程序,在手机端登录时需要保证网络是电信的C网(CTNET或者CTWAP),这其实就是运营商的网络限制方式,我们的应用不允许你用别的运营商的网络,虽说这种限制未必正确,不过实际中的确会遇到。
好了,对于现在正在用的APN的获取我们可以通过:
Cursor mCursor = this.getContentResolver().query(Uri.parse("content://telephony/carriers/preferapn"), null, null, null, null);
while(mCursor != null && mCursor.moveToNext())
{
String name = mCursor.getString(mCursor.getColumnIndex("name"));
System.out.println("网络连接------------->"+name);
}
然后通过
if(name.contains("中国电信")||name.contains("CT")||name.contains("ct"))
return true;
来判断是否符合我的APN的需要。
这是我之前的想法,事实证明,也许在单模手机上可以正确控制,但是如果在MOTO XT800这类双模手机上就会有问题了,因为当你把网络手动切换到G网时,从数据库中取到的APN名字仍然是之前设置的“中国电信***”之类的接入点,后来发现这种手机在网络设置中的移动网络设置项中有CDMA和GSM两项,也就是说CDMA有CDMA的preferapn,GSM有GSM的preferapn,虽然我手动把网络切换到了G网,但是从数据库中去取apn的时候还是从默认的CDMA项中取的,这样就导致了我无法判断用户是否在用G网登陆我的系统。
使用TelephonyManager也是一样的,无法判断,同样会从CDMA项中去取
// TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
// if(tm.getNetworkType()==TelephonyManager.NETWORK_TYPE_CDMA) {
// System.out.println("---------------------------C网-------------------------");
// }
// System.out.println("----------------------------------->"+tm.getNetworkType());
// if(tm.getPhoneType()==TelephonyManager.PHONE_TYPE_CDMA) {
// System.out.println("---------------------------C-------------------------");
// }
后来查了google的文档,总算找了救星,就是:NetworkInfo
通过NetworkInfo的toString()方法可以查看到当前所用的网络的所有信息,当然这个NetworkInfo对象是通过ConnectivityManager对象的getActiveNetworkInfo()方法得到的,用以获取当前正在使用的NetworkInfo对象,代码如下:
public boolean checkNetWork() {
ConnectivityManager conMan = (ConnectivityManager) this
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nwi = conMan.getActiveNetworkInfo();
System.out.println("nwi---------------------------->"+nwi);
String extraInfo = nwi.getExtraInfo();
System.out.println("extraInfo---------------------------->"+extraInfo);
if(extraInfo.contains("GSM"))
return false;
if(extraInfo.contains("#777:CDMA")) {
// TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
// if(tm.getNetworkType()==TelephonyManager.NETWORK_TYPE_CDMA) {
// System.out.println("---------------------------C网-------------------------");
// }
// System.out.println("----------------------------------->"+tm.getNetworkType());
// if(tm.getPhoneType()==TelephonyManager.PHONE_TYPE_CDMA) {
// System.out.println("---------------------------C-------------------------");
// }
Cursor mCursor = this.getContentResolver().query(Uri.parse("content://telephony/carriers/preferapn"), null, null, null, null);
while(mCursor != null && mCursor.moveToNext())
{
String name = mCursor.getString(mCursor.getColumnIndex("name"));
System.out.println("网络连接------------->"+name);
if(name.contains("中国电信")||name.contains("CT")||name.contains("ct"))
return true;
}
}
return false;
}