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

来源:互联网 发布:excite翻译软件 编辑:程序博客网 时间:2024/06/09 18:02

判断网络状态,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" />  

//注册广播 包名+类名

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

三: 写一个构造方法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 == 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

0 0
原创粉丝点击