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添加中國移動代理》