android基礎知識40:Android網路連接

來源:互聯網
上載者:User

1、android網路連接的類型
2、判斷網路是否串連
3、監聽網路
4、網路有問題時提示使用者佈建網路
5、添加中國移動代理

1、android網路連接的類型

很多朋友在android開發中,都會遇到行動電話通訊類型判斷,因為就目前的android平台手機來說:可能會存在4中狀態
      1.無網路(這種狀態可能是因為手機停機,網路沒有開啟,訊號不好等原因)
      2.使用WIFI上網
      3.CMWAP(中國移動代理)
      4.CMNET上網
 這四種狀態,如果沒有網路,肯定是無法請求Internet了,如果是wap就需要為手機添加中國移動代理,關於為手機添加中國移動的代理,請到
http://www.2cto.com/kf/201111/112100.html 這裡寫有關於添加中國移動代理的例子!
下面是網路判斷的方法:

/**       * @author sky       * Email vipa1888@163.com       * QQ:840950105       * 擷取當前的網路狀態  -1:沒有網路  1:WIFI網路2:wap網路3:net網路       * @param context       * @return       */       public static int getAPNType(Context context){          int netType = -1;           ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);          NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();          if(networkInfo==null){              return netType;          }          int nType = networkInfo.getType();          if(nType==ConnectivityManager.TYPE_MOBILE){              Log.e("networkInfo.getExtraInfo()", "networkInfo.getExtraInfo() is "+networkInfo.getExtraInfo());              if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){                  netType = CMNET;              }              else{                  netType = CMWAP;              }          }          else if(nType==ConnectivityManager.TYPE_WIFI){              netType = WIFI;          }          return netType;      }

2、判斷網路是否串連

1)判斷是否有網路連接

public boolean isNetworkConnected(Context context) {       if (context != null) {           ConnectivityManager mConnectivityManager = (ConnectivityManager) context                   .getSystemService(Context.CONNECTIVITY_SERVICE);           NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();           if (mNetworkInfo != null) {               return mNetworkInfo.isAvailable();           }       }       return false;   }

2)判斷WIFI網路是否可用

public boolean isWifiConnected(Context context) {       if (context != null) {           ConnectivityManager mConnectivityManager = (ConnectivityManager) context                   .getSystemService(Context.CONNECTIVITY_SERVICE);           NetworkInfo mWiFiNetworkInfo = mConnectivityManager                   .getNetworkInfo(ConnectivityManager.TYPE_WIFI);           if (mWiFiNetworkInfo != null) {               return mWiFiNetworkInfo.isAvailable();           }       }       return false;   }

3)判斷MOBILE網路是否可用

public boolean isMobileConnected(Context context) {       if (context != null) {           ConnectivityManager mConnectivityManager = (ConnectivityManager) context                   .getSystemService(Context.CONNECTIVITY_SERVICE);           NetworkInfo mMobileNetworkInfo = mConnectivityManager                   .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);           if (mMobileNetworkInfo != null) {               return mMobileNetworkInfo.isAvailable();           }       }       return false;   }

4)擷取當前網路連接的類型資訊

public static int getConnectedType(Context context) {       if (context != null) {           ConnectivityManager mConnectivityManager = (ConnectivityManager) context                   .getSystemService(Context.CONNECTIVITY_SERVICE);           NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();           if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {               return mNetworkInfo.getType();           }       }       return -1;   }

5)擷取當前網路電訊廠商

public static int getNetWorkType(Context context) {int netType = -1;TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);String simOperator = manager.getSimOperator();if( simOperator != null ) {if( simOperator.startsWith("46000") || simOperator.startsWith("46002") ) {netType = NETTYPE_MOBILE;} else if(simOperator.startsWith("46001")) {netType = NETTYPE_UNICOM;} else if(simOperator.startsWith("46003")) {netType = NETTYPE_TELECOM;}}return netType;}

3、監聽網路

在開發android應用時,涉及到要進行網路訪問,時常需要進行網路狀態的檢查,以提供給使用者必要的提醒。一般可以通過ConnectivityManager來完成該工作。
ConnectivityManager有四個主要任務:
1)、監聽行動電話通訊狀態(包括GPRS,WIFI, UMTS等)
2)、手機狀態發生改變時,發送廣播
3)、當一個網路連接失敗時進行故障切換
4)、為應用程式提供可以擷取可用網路的高精度和粗糙的狀態
當我們要在程式中監聽網路狀態時,只要一下幾個步驟即可:

1)、定義一個Receiver重載其中的onReceive函數,在其中完成所需要的功能,如根據WIFI和GPRS是否斷開來改變空間的外觀

connectionReceiver = new BroadcastReceiver() {      @Override   public void onReceive(Context context, Intent intent) {    ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);    NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);    NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);    if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {     Log.i(TAG, "unconnect");     // unconnect network     }else {    // connect network     }   }  };

2)、在適當的地方註冊Receiver,可以在程式中註冊,在onCreate中調用如下函數即可:

IntentFilter intentFilter = new IntentFilter();  intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);  registerReceiver(connectionReceiver, intentFilter);

3、在適當時取消註冊Receiver,可以在程式中取消,在onDestroye中調用如下函數即可:

if (connectionReceiver != null) {   unregisterReceiver(connectionReceiver);  }

Ps:網上還有很多關於使用TelephonyManager 的方法的,方法如下(但是我試了好幾次都有問題,如每次第一次進入一個Activity時會自動收到網路斷開的訊號,每次網路狀態改變時收到多次回調且狀態不正確。不知道有什麼要注意的地方,求指點!)

final TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  mTelephonyMgr.listen(new PhoneStateListener(){@Overridepublic void onDataConnectionStateChanged(int state) {switch(state){case TelephonyManager.DATA_DISCONNECTED://網路斷開break;case TelephonyManager.DATA_CONNECTING://網路正在串連break;case TelephonyManager.DATA_CONNECTED://網路連接上break;}}}, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

至於第二種方法,本人並沒有去嘗試過。第一種方式還是比較好用,如果要程式隱藏在背景話,建議開個service,將BroadcastReceiver註冊在service,但不要忘了取消註冊。

在測試中遇到過這樣的狀況,將一個當前串連wifi的路由裝置關閉,但是程式並沒有捕捉到unconnect network,可能是因為手機裝置立刻串連另一個路由裝置了。

4、網路有問題時提示使用者佈建網路

由於Android的SDK版本不同所以裡面的API和設定方式也是有少量變化的,尤其是在Android
3.0 及後面的版本,UI和顯示方式也發生了變化,現在就以開啟網路設定為例,同大家分享一下,效果如下:

1).
首先先看一下Android 判斷網路是否已開啟(如果直接寫在Activity裡面,則可以不需要參數)

/*     * 判斷網路連接是否已開     * 2012-08-20     *true 已開啟  false 未開啟     * */    public static boolean isConn(Context context){        boolean bisConnFlag=false;        ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo network = conManager.getActiveNetworkInfo();        if(network!=null){            bisConnFlag=conManager.getActiveNetworkInfo().isAvailable();        }        return bisConnFlag;    }

2). 如果未開啟網路調用開啟設定介面(如果不寫在Activity裡面則不需要參數)

/*     * 開啟設定網路介面     * */    public static void setNetworkMethod(final Context context){        //提示對話方塊        AlertDialog.Builder builder=new Builder(context);        builder.setTitle("網路設定提示").setMessage("網路連接不可用,是否進行設定?").setPositiveButton("設定", new DialogInterface.OnClickListener() {                        @Override            public void onClick(DialogInterface dialog, int which) {                // TODO Auto-generated method stub                Intent intent=null;                //判斷手機系統的版本  即API大於10 就是3.0或以上版本                 if(android.os.Build.VERSION.SDK_INT>10){                    intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);                }else{                    intent = new Intent();                    ComponentName component = new ComponentName("com.android.settings","com.android.settings.WirelessSettings");                    intent.setComponent(component);                    intent.setAction("android.intent.action.VIEW");                }                context.startActivity(intent);            }        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {                        @Override            public void onClick(DialogInterface dialog, int which) {                // TODO Auto-generated method stub                dialog.dismiss();            }        }).show();    }

3).  在 AndroidManifest.xml中設定許可權

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    <uses-permission android:name="android.permission.INTERNET"/>

4). 在相應的位置調用即可

if(!ConnectionUtil.isConn(getApplicationContext())){            ConnectionUtil.setNetworkMethod(MainActivity.this);        }

這樣在軟體開啟時加上判斷就可以先設定網路了。


5、添加中國移動代理

     在android中,一般需要連網的時候前,都要做一次網路的判斷,判斷當前的網路狀態!然後開始請求網路
     當我們使用wap網路的時候,程式中必須要中國移動代理!這樣的話,手機才能正常的訪問internet!
     在android中,有兩種方式請求網路:HttpURLConnection和HttpClient請求方式,如果網路狀態為wap的時候,都要為兩種請求添加中國移動代理的!
     第一種方式:HttpURLConnection

/** * @author sky * Email vipa1888@163.com * QQ:840950105 * 使用HttpURLConnection請求Internet * @param context   context對象 * @param requestUrl  請求的URL * @param param   請求的參數 * @return  返回一個inputstream流 */ public static InputStream getHttpURLConnectionInputStream(Context context,String requestUrl,Map<String, String> param) {          URL url;     HttpURLConnection conn = null;     InputStream input = null;     try {         url = new URL(requestUrl);         if(getAPNType(context)==NetWorkUtil.CMWAP)   //當請求的網路為wap的時候,就需要添加中國移動代理         {             Proxy proxy = new Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress("10.0.0.172", 80));             conn = (HttpURLConnection) url.openConnection(proxy);         }             conn = (HttpURLConnection) url.openConnection();                      conn.setConnectTimeout(10000);    //請求逾時             conn.setRequestMethod("POST");  //請求方式             conn.setReadTimeout(1000);   //讀取逾時             conn.setDoOutput(true);             conn.setDoInput(true);             conn.setUseCaches(false);             conn.setRequestProperty("Charset", "UTF-8");             conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");             OutputStream os = conn.getOutputStream();                 StringBuilder sb = new StringBuilder();             Iterator<String> it = param.keySet().iterator();             while (it.hasNext()) {                 String key = it.next();                 String value = param.get(key);                 sb.append(key).append("=").append(value).append("&");             }             String p = sb.toString().substring(0, sb.length()-1);             System.out.println("請求的參數"+p);             os.write(p.getBytes("utf-8"));             os.close();             if(conn!=null)             {                 input = conn.getInputStream();             }              } catch (Exception e) {         e.printStackTrace();     }     return input; } 

上面這種方式就是HttpURLConnection ,這種方式在android開發中也是比較常用的,希望朋友們也要熟悉的掌握!
       第二種方式:HttpClient

/** * @author sky * Email vipa1888@163.com * QQ:840950105 * 使用HttpURLConnection請求Internet * @param context   context對象 * @param requestUrl  請求的URL * @param param   請求的參數 * @return  返回一個inputstream流 */ public static InputStream getHttpClientInputStream(Context context,String requestUrl, Map<String, String> param)throws Exception {     HttpClient client = new DefaultHttpClient();     if(getAPNType(context)==NetWorkUtil.CMWAP)  //當請求的網路為wap的時候,就需要添加中國移動代理     {          HttpHost proxy = new HttpHost("10.0.0.172", 80);         client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,                 proxy);     }  www.2cto.com    HttpPost hp = new HttpPost(requestUrl);     hp.setHeader("Charset", "UTF-8");     hp.setHeader("Content-Type", "application/x-www-form-urlencoded");     List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();          Iterator<String> it = param.keySet().iterator();     while (it.hasNext()) {         String key = it.next();         list.add(new BasicNameValuePair(key, param.get(key)));     }     hp.setEntity(new UrlEncodedFormEntity(list,"UTF-8"));     HttpResponse response = null;     response = client.execute(hp);     return response.getEntity().getContent(); } 

      這個httpClient實現了android內建的DefaultHttpClient,所以使用起來還是很方便的!
      但是我發現HttpClient 比HttpURLConnection 要好一些,因為HttpURLConnection 如果使用wap在上網請求的時候,存在很多問題的(我是深有體會的,比如請求無響應,訊號不好都可能造成一些未知的錯誤)
     好了,熟悉掌握了兩種請求方式了,android的連網應用就可以開發了!呵呵


參考資料:
《Android網路連接判斷與處理》

《Android判斷網路是否開啟,並開啟設定網路介面》

《android為HttpClient和HttpURLConnection添加中國移動代理》

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.