Broadcast监听网络状态,ping判断网络是否可用

         判断网络状态,android提供了api,可以很方便的使用。但是在某些情况下,网络状态连接正常,但是并不一定就可以去访问其他网页。比如,路由器打开了,但是没有插上网线,手机GPRS打开了,但是手机已经欠费了。这种情况,有网络连接,但是依旧上不了网。根据android提供的api,我们只能判断是否网络连接正常,无法去判断是否可以访问其他网站。

       

         最近,一个项目中遇到这样的问题,因为这个app太依赖于网络了,而且还是那种可以对外访问的网络连接,用到socket的UDP、TCP和Http(题外话)。为了解决有网络连接但是上不了网,本人查了一些资料,写了一个Dome,在这里跟猿媛们分享一下!


先简单的说一下我的思路:

1,通过Broadcast去监听手机网络状态的变化。无非两种结果,网络连接和网络断开;

2,当网络连接的时候,我们采取ping的方式去判断网络是否可以对外访问;


代码如下:

一:需要注册广播,联网权限,网络状态变化,在AndroidManifest.xml 加入

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

//注册广播    包名+类名

<service android:name="com.example.test.NetworkChangeReceive" > </service>

二:写一个广播

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");
			}

		}
	}
</pre>三: 写一个构造方法ping<p></p><pre name="code" class="java">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 == 0) {

					Toast.makeText(MainActivity.this, "net is  available", 0)
							.show();

					return true;
				} else {
					Toast.makeText(MainActivity.this, "net is not available", 0)
							.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
 

猜你喜欢

转载自blog.csdn.net/kern_/article/details/48731897