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;
    }