判斷網絡狀态,android提供了api,可以很友善的使用。但是在某些情況下,網絡狀态連接配接正常,但是并不一定就可以去通路其他網頁。比如,路由器打開了,但是沒有插上網線,手機GPRS打開了,但是手機已經欠費了。這種情況,有網絡連接配接,但是依舊上不了網。根據android提供的api,我們隻能判斷是否網絡連接配接正常,無法去判斷是否可以通路其他網站。
最近,一個項目中遇到這樣的問題,因為這個app太依賴于網絡了,而且還是那種可以對外通路的網絡連接配接,用到socket的UDP、TCP和Http(題外話)。為了解決有網絡連接配接但是上不了網,本人查了一些資料,寫了一個Demo,在這裡跟猿媛們分享一下!
先簡單的說一下我的思路:
1,通過Broadcast去監聽手機網絡狀态的變化。無非兩種結果,網絡連接配接和網絡斷開;
2,當網絡連接配接的時候,我們采取ping的方式去判斷網絡是否可以對外通路;
代碼如下:
一:需要注冊廣播,聯網權限,網絡狀态變化,在AndroidManifest.xml 加入
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
//注冊廣播 包名+類名
二:寫一個廣播
class NetworkChangeReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager
.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
networkState = true;
ping(networkState);//最好再次調用ping方法
Toast.makeText(MainActivity.this, "net is connections",
Toast.LENGTH_SHORT).show();
Log.e(TAG, "net is connections");
} else {
networkState = false;
// connections
Toast.makeText(MainActivity.this, "net is not connections",
Toast.LENGTH_SHORT).show();
Log.e(TAG, "net is not connections");
}
}
}
三: 寫一個構造方法ping
public boolean ping(boolean networkState) {
InputStream input = null;
BufferedReader in;
StringBuffer stringBuffer;
if (networkState) {
try {
String ip = "www.baidu.com";//之是以寫百度是因為百度比較穩定,一般不會出現問題,也可以ping自己的伺服器
Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping3次
// 讀取ping的内容
input = p.getInputStream();
in = new BufferedReader(new InputStreamReader(input));
stringBuffer = new StringBuffer();
String content = "";
while ((content = in.readLine()) != null) {
stringBuffer.append(content);
}
// PING的狀态
int status = p.waitFor(); //status 為 0 ,ping成功,即為可以對外通路;為2則失敗,即聯網但不可以上網
if (status == ) {
Toast.makeText(MainActivity.this, "net is available", )
.show();
return true;
} else {
Toast.makeText(MainActivity.this, "net is not available", )
.show();
return false;
}
} catch (IOException e) {
Log.e(TAG, "IOException");
} catch (InterruptedException e) {
Log.e(TAG, "InterruptedException");
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
return false;
}
四:MainActivity中注冊廣播
<pre name="code" class="java"> @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView click = (TextView) findViewById(R.id.click);
click.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
、、Intent intent = new Intent(MainActivity.this,
NextActivity.class);
startActivity(intent);
}
});
intentFilter = new IntentFilter();
// addAction
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
Log.e(TAG, "Done1");
networkChangeReceive = new NetworkChangeReceive();
registerReceiver(networkChangeReceive, intentFilter);//注冊廣播
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "程式退出");
unregisterReceiver(networkChangeReceive);//取消注冊廣播
}
源碼下載下傳:http://download.csdn.net/detail/kern_/9138873