2015年4月23日 星期四

偵測網路是否已連上

出處:http://blog.xuite.net/tony1107/learning/62955659-Android+-+%E6%AA%A2%E6%9F%A5%E7%B6%B2%E8%B7%AF%E9%80%A3%E7%B7%9A%E7%8B%80%E6%85%8B

通常手機在開發網路的應用程式時, 常會定時的去取資料回來

但…倘若目前手機無法對外連線, 則這段動作就會造成手機效能無謂的耗損、與電力的浪費

所以在開發網路型的應用程式時, 首先要做的第一個功課, 便是 “判斷手機目前是否已連線"

而 Android 系統的手機, 目前是否連上網路? 以什麼方式連上網路? (WIFI / 3G…)?

目前網路是否故障中(Failover)? 目前手機是否在漫遊中(Roaming)?

這些相關的資訊, 都存在於 ConnectivityManager 這個類別當中

而使用的方式只需要去向系統取回這個服務即可


ConnectivityManager CM =

                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo info = CM.getActiveNetworkInfo();



而當中要注意到的地方, 是在 NetworkInfo 這段,

倘若你的手機目前不在網路的服務範圍, 也就是說沒有任何方式可以連出去網路

則 CM.getActiveNetworkInfo() 取回的 Reference 會是 Null,

忘了做此判斷的話, 手機則會立刻罷工給你看 (NullPointerException)

而比較常見需要取得的資料如下:


info.getTypeName(); // 目前以何種方式連線 [WIFI]
info.getState(); // 目前連線狀態 [CONNECTED]
info.isAvailable(); // 目前網路是否可使用 [true]
info.isConnected(); // 網路是否已連接 [true]
info.isConnectedOrConnecting(); // 網路是否已連接 或 連線中 [true]
info.isFailover(); 
// 網路目前是否有問題 [false]
info.isRoaming(); // 網路目前是否在漫遊中 [false]


除此之外, 也必需替應用程式設定權限, 不然手機一樣會罷工給你看 (SecurityException)

設定權限的方式則是在 AndroidManifest.xml 裡頭新增底下的權限

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

例如:


public class testActivity extends Activity {

略....

//偵測是否有連到網路上
private boolean checkNetworkConnected() {
boolean result = false;
ConnectivityManager CM = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if (CM == null) {
result = false;
} else {
NetworkInfo info = CM.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if (!info.isAvailable()) {
result = false;
} else {
result = true;
}
Log.d(TAG, "[目前連線方式]"+info.getTypeName());
Log.d(TAG, "[目前連線狀態]"+info.getState());
Log.d(TAG, "[目前網路是否可使用]"+info.isAvailable());
Log.d(TAG, "[網路是否已連接]"+info.isConnected());
Log.d(TAG, "[網路是否已連接 或 連線中]"+info.isConnectedOrConnecting());
Log.d(TAG, "[網路目前是否有問題 ]"+info.isFailover());
Log.d(TAG, "[網路目前是否在漫遊中]"+info.isRoaming());
}
}
return result;
}

}