我们使用Android设备连接网络时,如果是wap接入点就需要设置代理,而电信和移动联通的代理并不相同,移动和联通的wap代理都是10.0.0.172:80,电信的wap代理是10.0.0.200:80,所以进行Android开发时很有必要判断接入点。

       接入点的类型

       Net网络:运营商(移动联通电信)net网络,wifi,usb网络共享

       Wap网络:移动联通wap(代理相同:10.0.0.172:80),电信wap(代理:10.0.0.200:80)

       这样看来就可以抽象出三种网络类型:联通移动wap,电信wap,其他的都是net类型。

       接入点判断实例

        下面给出了接入点判断的实例代码,其中进行了一些注解,都是一些在实际项目开发中需要注意的地方。分享给大家以供参考。

Java代码
  1. package com.johnson.utils;    
  2. import com.shoowc.R;    
  3. import android.app.Activity;    
  4. import android.content.Context;    
  5. import android.database.Cursor;    
  6. import android.net.ConnectivityManager;    
  7. import android.net.NetworkInfo;    
  8. import android.net.Uri;    
  9. import android.os.Bundle;    
  10. import android.text.TextUtils;    
  11. import android.util.Log;    
  12.   
  13. public class EX01_CheckApnTypeActivity extends Activity {    
  14.   /** Called when the activity is first created. */    
  15.   public static final    String CTWAP = "ctwap";    
  16.   public static final    String CMWAP = "cmwap";    
  17.   public static final    String WAP_3G = "3gwap";    
  18.   public static final    String UNIWAP = "uniwap";    
  19.   public static final    int TYPE_NET_WORK_DISABLED = 0;// 网络不可用    
  20.   public static final    int TYPE_CM_CU_WAP = 4;// 移动联通wap10.0.0.172    
  21.   public static final    int TYPE_CT_WAP = 5;// 电信wap 10.0.0.200    
  22.   public static final    int TYPE_OTHER_NET = 6;// 电信,移动,联通,wifi 等net网络    
  23.   public static Uri PREFERRED_APN_URI = Uri    
  24.   .parse("content://telephony/carriers/preferapn");    
  25.   @Override    
  26.   public void onCreate(Bundle savedInstanceState) {    
  27.     super.onCreate(savedInstanceState);    
  28.     setContentView(R.layout.main);    
  29.   
  30.     checkNetworkType(this);    
  31.   }    
  32.   
  33.   /***   
  34.     * 判断Network具体类型(联通移动wap,电信wap,其他net)   
  35.     *      
  36.     * */    
  37.   public static int checkNetworkType(Context mContext) {    
  38.     try {    
  39.       final ConnectivityManager connectivityManager = (ConnectivityManager) mContext    
  40.           .getSystemService(Context.CONNECTIVITY_SERVICE);    
  41.       final NetworkInfo mobNetInfoActivity = connectivityManager    
  42.           .getActiveNetworkInfo();    
  43.       if (mobNetInfoActivity == null || !mobNetInfoActivity.isAvailable()) {    
  44.             
  45.   
  46.         // 注意一:    
  47.         // NetworkInfo 为空或者不可以用的时候正常情况应该是当前没有可用网络,    
  48.         // 但是有些电信机器,仍可以正常联网,    
  49.         // 所以当成net网络处理依然尝试连接网络。    
  50.         // (然后在socket中捕捉异常,进行二次判断与用户提示)。    
  51.             
  52.         Log.i("""=====================>无网络");    
  53.         return TYPE_OTHER_NET;    
  54.       } else {    
  55.   
  56.         // NetworkInfo不为null开始判断是网络类型    
  57.   
  58.         int netType = mobNetInfoActivity.getType();    
  59.         if (netType == ConnectivityManager.TYPE_WIFI) {    
  60.           // wifi net处理    
  61.           Log.i("""=====================>wifi网络");    
  62.           return TYPE_OTHER_NET;    
  63.         } else if (netType == ConnectivityManager.TYPE_MOBILE) {    
  64.                
  65.   
  66.           // 注意二:    
  67.           // 判断是否电信wap:    
  68.           //不要通过getExtraInfo获取接入点名称来判断类型,    
  69.           // 因为通过目前电信多种机型测试发现接入点名称大都为#777或者null,    
  70.           // 电信机器wap接入点中要比移动联通wap接入点多设置一个用户名和密码,    
  71.           // 所以可以通过这个进行判断!    
  72.   
  73.           final Cursor c = mContext.getContentResolver().query(    
  74.               PREFERRED_APN_URI, nullnullnullnull);    
  75.           if (c != null) {    
  76.             c.moveToFirst();    
  77.             final String user = c.getString(c    
  78.                 .getColumnIndex("user"));    
  79.             if (!TextUtils.isEmpty(user)) {    
  80.               Log.i("",    
  81.                   "=====================>代理:"    
  82.                       + c.getString(c    
  83.                           .getColumnIndex("proxy")));    
  84.               if (user.startsWith(CTWAP)) {    
  85.                 Log.i("""=====================>电信wap网络");    
  86.                 return TYPE_CT_WAP;    
  87.               }    
  88.             }    
  89.           }    
  90.           c.close();    
  91.                
  92.                
  93.           // 注意三:    
  94.           // 判断是移动联通wap:    
  95.           // 其实还有一种方法通过getString(c.getColumnIndex("proxy")获取代理ip    
  96.           //来判断接入点,10.0.0.172就是移动联通wap,10.0.0.200就是电信wap,但在    
  97.           //实际开发中并不是所有机器都能获取到接入点代理信息,例如魅族M9 (2.2)等...    
  98.           // 所以采用getExtraInfo获取接入点名字进行判断    
  99.                
  100.           String netMode = mobNetInfoActivity.getExtraInfo();    
  101.           Log.i("""netMode ================== " + netMode);    
  102.           if (netMode != null) {    
  103.             // 通过apn名称判断是否是联通和移动wap    
  104.             netMode=netMode.toLowerCase();    
  105.             if (netMode.equals(CMWAP) || netMode.equals(WAP_3G)    
  106.                 || netMode.equals(UNIWAP)) {    
  107.               Log.i("""=====================>移动联通wap网络");    
  108.               return TYPE_CM_CU_WAP;    
  109.             }    
  110.   
  111.           }    
  112.   
  113.         }    
  114.       }    
  115.     } catch (Exception ex) {    
  116.       ex.printStackTrace();    
  117.       return TYPE_OTHER_NET;    
  118.     }    
  119.   
  120.     return TYPE_OTHER_NET;    
  121.   
  122.   }    
  123. }  

       以上是完整的实例代码,另外附加了详细的注解,相信大家能够看的很明白了。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/32.html
2012年5月10日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:1