您的位置:首页 > 理论基础 > 计算机网络

android 监听网络状态的变化及实战

2016-11-03 21:49 375 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]
android 监听网络状态的变化及实际应用
实现思路
使用静态广播还是动态注册广播的方式好呢

通过广播监听网络状态的两种方法
静态注册
动态注册
我们自定义的NetworkChangeListener广播
思路解析

ConnectivityManager和NetworkInfo
ConnectivityManager主要用来干什么
怎样获取ConnectivityManager对象呢
获取 NetworkInfo对象

网络错误情况的处理
代码如下

智能无图
效果图如下
实现的核心代码如下

拓展工具类

android 监听网络状态的变化及实际应用

转载请注明博客地址:http://blog.csdn.NET/gdutxiaoxu/article/details/53008266

平时我们在请求错误的情况下,通常会进行处理一下,一般来说,主要分为两方面的错误

- 没有网络的错误

- 在有网络的情况下,我们客户端的错误或者服务器端的错误

今天这篇博客主要阐述以下问题

怎样监听网络状态的变化,包括是否打开WiFi,否打开数据网络,当前连接的网络是否可用
网络没有打开情况下的处理,如弹出对话框,跳转到 打开 WiFi设置的界面等
非WiFi情况下是否加载图片,是否播放视频等

实现思路

在网络错误的情况下获取网络状态进行判断,这种方法是可行的,但你想过了没有,如果每次都要进行这样的判断,岂不是代码量很多?有人会说,那把代码封装到一个类不就好了吗?这样确实能减少代码量,但是每次都要主动去获取,这样是不是挺麻烦的。实际上,google 早就帮我们封装好了,在网络状态变化的情况下会发出广播,我们只需要监听广播就好了 。

使用静态广播还是动态注册广播的方式好呢?

如果你不太清楚的话,我只能说即 基础不扎实。我们的应用之所以要监听网络状态的 变化,主要是为了在错误的情况下方便进行处理,退出我们当前的应用之后当然不需要监听了,所以选择动态注册广播。

动态注册:随着所在的Activity或者应用销毁 以后,不会受到该广播
静态注册:退出应用后,仍然能够收到相应的广播
共同点:都需要在AndroidMainest清单文件里面注册

通过广播监听网络状态的两种方法

静态注册

<code class="language-java hljs  has-numbering"><receiver android:name=<span class="hljs-string">".network.NetworkConnectChangedReceiver"</span>>
<intent-filter>
<action android:name=<span class="hljs-string">"android.NET.conn.CONNECTIVITY_CHANGE"</span> />
<action android:name=<span class="hljs-string">"android.Net.wifi.WIFI_STATE_CHANGED"</span> />
<action android:name=<span class="hljs-string">"android.net.wifi.STATE_CHANGE"</span> />
</intent-filter>
</receiver>

</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

动态注册

第一步:在AndroidMainest文件里面注册

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">receiver</span> <span class="hljs-attribute">android:name</span>=<span class="hljs-value">".network.NetworkConnectChangedReceiver"</span>></span>
<span class="hljs-tag"></<span class="hljs-title">receiver</span>></span></code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li></ul>

第二步:调用 Context registerReceiver(Receiver,IntentFilter) 进行注册

<code class="language-java hljs  has-numbering">IntentFilter filter = <span class="hljs-keyword">new</span> IntentFilter();
filter.addAction(<span class="hljs-string">"android.net.conn.CONNECTIVITY_CHANGE"</span>);
filter.addAction(<span class="hljs-string">"android.net.wifi.WIFI_STATE_CHANGED"</span>);
filter.addAction(<span class="hljs-string">"android.net.wifi.STATE_CHANGE"</span>);
registerReceiver(mNetworkChangeListener,filter);

</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>

我们自定义的NetworkChangeListener广播

<code class="language-java hljs  has-numbering">
<span class="hljs-javadoc">/**
* 网络改变监控广播
* <p>
* 监听网络的改变状态,只有在用户操作网络连接开关(wifi,mobile)的时候接受广播,
* 然后对相应的界面进行相应的操作,并将 状态 保存在我们的APP里面
* <p>
* <p>
* Created by xujun
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NetworkConnectChangedReceiver</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">BroadcastReceiver</span> {</span>

<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TAG = <span class="hljs-string">"xujun"</span>;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TAG1 = <span class="hljs-string">"xxx"</span>;

<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onReceive</span>(Context context, Intent intent) {
<span class="hljs-comment">// 这个监听wifi的打开与关闭,与wifi的连接无关</span>
<span class="hljs-keyword">if</span> (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
<span class="hljs-keyword">int</span> wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, <span class="hljs-number">0</span>);
Log.e(TAG1, <span class="hljs-string">"wifiState"</span> + wifiState);
<span class="hljs-keyword">switch</span> (wifiState) {
<span class="hljs-keyword">case</span> WifiManager.WIFI_STATE_DISABLED:
APP.getInstance().setEnablaWifi(<span class="hljs-keyword">false</span>);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> WifiManager.WIFI_STATE_DISABLING:

<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> WifiManager.WIFI_STATE_ENABLING:
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> WifiManager.WIFI_STATE_ENABLED:
APP.getInstance().setEnablaWifi(<span class="hljs-keyword">true</span>);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> WifiManager.WIFI_STATE_UNKNOWN:
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">default</span>:
<span class="hljs-keyword">break</span>;

}
}
<span class="hljs-comment">// 这个监听wifi的连接状态即是否连上了一个有效无线路由,当上边广播的状态是WifiManager</span>
<span class="hljs-comment">// .WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的时候,根本不会接到这个广播。</span>
<span class="hljs-comment">// 在上边广播接到广播是WifiManager.WIFI_STATE_ENABLED状态的同时也会接到这个广播,</span>
<span class="hljs-comment">// 当然刚打开wifi肯定还没有连接到有效的无线</span>
<span class="hljs-keyword">if</span> (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
Parcelable parcelableExtra = intent
.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> != parcelableExtra) {
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
State state = networkInfo.getState();
<span class="hljs-keyword">boolean</span> isConnected = state == State.CONNECTED;<span class="hljs-comment">// 当然,这边可以更精确的确定状态</span>
Log.e(TAG1, <span class="hljs-string">"isConnected"</span> + isConnected);
<span class="hljs-keyword">if</span> (isConnected) {
APP.getInstance().setWifi(<span class="hljs-keyword">true</span>);
} <span class="hljs-keyword">else</span> {
APP.getInstance().setWifi(<span class="hljs-keyword">false</span>);
}
}
}
<span class="hljs-comment">// 这个监听网络连接的设置,包括wifi和移动数据的打开和关闭。.</span>
<span class="hljs-comment">// 最好用的还是这个监听。wifi如果打开,关闭,以及连接上可用的连接都会接到监听。见log</span>
<span class="hljs-comment">// 这个广播的最大弊端是比上边两个广播的反应要慢,如果只是要监听wifi,我觉得还是用上边两个配合比较合适</span>
<span class="hljs-keyword">if</span> (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
Log.i(TAG1, <span class="hljs-string">"CONNECTIVITY_ACTION"</span>);

NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
<span class="hljs-keyword">if</span> (activeNetwork != <span class="hljs-keyword">null</span>) { <span class="hljs-comment">// connected to the internet</span>
<span class="hljs-keyword">if</span> (activeNetwork.isConnected()) {
<span class="hljs-keyword">if</span> (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
<span class="hljs-comment">// connected to wifi</span>
APP.getInstance().setWifi(<span class="hljs-keyword">true</span>);
Log.e(TAG, <span class="hljs-string">"当前WiFi连接可用 "</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
<span class="hljs-comment">// connected to the mobile provider's data plan</span>
APP.getInstance().setMobile(<span class="hljs-keyword">true</span>);
Log.e(TAG, <span class="hljs-string">"当前移动网络连接可用 "</span>);
}
} <span class="hljs-keyword">else</span> {
Log.e(TAG, <span class="hljs-string">"当前没有网络连接,请确保你已经打开网络 "</span>);
}

Log.e(TAG1, <span class="hljs-string">"info.getTypeName()"</span> + activeNetwork.getTypeName());
Log.e(TAG1, <span class="hljs-string">"getSubtypeName()"</span> + activeNetwork.getSubtypeName());
Log.e(TAG1, <span class="hljs-string">"getState()"</span> + activeNetwork.getState());
Log.e(TAG1, <span class="hljs-string">"getDetailedState()"</span>
+ activeNetwork.getDetailedState().name());
Log.e(TAG1, <span class="hljs-string">"getDetailedState()"</span> + activeNetwork.getExtraInfo());
Log.e(TAG1, <span class="hljs-string">"getType()"</span> + activeNetwork.getType());
} <span class="hljs-keyword">else</span> {   <span class="hljs-comment">// not connected to the internet</span>
Log.e(TAG, <span class="hljs-string">"当前没有网络连接,请确保你已经打开网络 "</span>);
APP.getInstance().setWifi(<span class="hljs-keyword">false</span>);
APP.getInstance().setMobile(<span class="hljs-keyword">false</span>);
APP.getInstance().setConnected(<span class="hljs-keyword">false</span>);

}

}
}

}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li></ul>

最后,别忘记添加一下权限

<code class="language-java hljs  has-numbering"><uses-permission android:name=<span class="hljs-string">"android.permission.INTERNET"</span>/>

<!--允许读取网络状态-->
<uses-permission android:name=<span class="hljs-string">"android.permission.ACCESS_NETWORK_STATE"</span>></uses-permission>
<!--允许读取wifi网络状态-->
<uses-permission android:name=<span class="hljs-string">"android.permission.ACCESS_WIFI_STATE"</span>/></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

思路解析

从上面的代码中,我们可以知道我们将我们当前的网络状态保存在我们的 APP 里面,这样当网络状态变化的时候会自动去改变 APP 里面相应的状态量,我们进行网络处理的 时候只需要去获取 APP里面的状态量,便可以判断出是属于哪一种网络错误,是不是很方便呢。

至于广播的Action主要有三种类型:

WifiManager.WIFI_STATE_CHANGED_ACTION

这个监听wifi的打开与关闭,与wifi的连接无关

WifiManager.NETWORK_STATE_CHANGED_ACTION:

这个监听wifi的连接状态即是否连上了一个有效无线路由,当上边广播的状态是WifiManager.WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的时候,根本不会接到这个广播。

在上边广播接到广播是WifiManager.WIFI_STATE_ENABLED状态的同时也会接到这个广播,当然刚打开wifi肯定还没有连接到有效的无线

ConnectivityManager.CONNECTIVITY_ACTION

这个监听网络连接的设置,包括wifi和移动数据的打开和关闭。.

最好用的还是这个监听。wifi如果打开,关闭,以及连接上可用的连接都会接到监听。这个广播的最大弊端是比上边两个广播的反应要慢,如果只是要监听wifi,我觉得还是用上边两个配合比较合适。

至于这个ConnectivityManager,NetworkInfo是什么东西,别急,下面会大概介绍一下。

ConnectivityManager和NetworkInfo

ConnectivityManager主要用来干什么

Monitor network connections (Wi-Fi, GPRS, UMTS, etc.) (用来处理网络连接 ,包括Wi-Fi, GPRS, UMTS等)
Send broadcast intents when network connectivity changes(用 网络状态发生变化的时候发出 广播 )
Attempt to “fail over” to another network when connectivity to a network is lost(但断开网络连接的时候,尝试去;连接另外一个网络
Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks(
Provide an API that allows applications to request and select networks for their data traffic

怎样获取ConnectivityManager对象呢?

<code class="hljs avrasm has-numbering">ConnectivityManager cm = (ConnectivityManager) context<span class="hljs-preprocessor">.getSystemService</span>(Context
<span class="hljs-preprocessor">.CONNECTIVITY</span>_SERVICE)<span class="hljs-comment">;</span></code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li></ul>

获取 NetworkInfo对象

主要有一下 几种方法

getNetworkInfo(int networkType),但是这个方法已经过时,官网的解释如下:This method was deprecated in API level 23. This method does not support multiple connected networks of the same type. Use getAllNetworks() and getNetworkInfo(android.net.Network) instead.
getNetworkInfo(Network network)
getActiveNetwork()

Returns a Network object corresponding to the currently active default data network.
getActiveNetworkInfo(),Returns details about the currently active default data network.
getAllNetworkInfo()这个方法已经过时,Use getAllNetworks() and getNetworkInfo(android.net.Network) instead.
综上所述,我们如果要知道当前Mobile网络或者WiFi网络是否已经连接上,总共有两种方法。

第一种方法,只不过在 API23的时候已经 过时了

<code class="language-java hljs  has-numbering">
State wifiState = <span class="hljs-keyword">null</span>;
State mobileState = <span class="hljs-keyword">null</span>;

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context
.CONNECTIVITY_SERVICE);
wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

Log.d(TAG1,
<span class="hljs-string">"wifi状态:"</span> + wifiState + <span class="hljs-string">"\n mobile状态:"</span> + mobileState);

<span class="hljs-keyword">if</span> (wifiState != <span class="hljs-keyword">null</span> && mobileState != <span class="hljs-keyword">null</span>
&& State.CONNECTED != wifiState
&& State.CONNECTED == mobileState) {<span class="hljs-comment">// 手机网络连接成功  </span>
Log.d(TAG1, <span class="hljs-string">"手机2g/3g/4g网络连接成功"</span>);

APP.getInstance().setMobile(<span class="hljs-keyword">true</span>);
APP.getInstance().setWifi(<span class="hljs-keyword">false</span>);
APP.getInstance().setConnected(<span class="hljs-keyword">true</span>);

} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (wifiState != <span class="hljs-keyword">null</span> && State.CONNECTED == wifiState) {<span class="hljs-comment">// 无线网络连接成功  </span>
Log.d(TAG1, <span class="hljs-string">"无线网络连接成功"</span>);

APP.getInstance().setMobile(<span class="hljs-keyword">false</span>);
APP.getInstance().setWifi(<span class="hljs-keyword">true</span>);
APP.getInstance().setConnected(<span class="hljs-keyword">true</span>);

} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (wifiState != <span class="hljs-keyword">null</span> && mobileState != <span class="hljs-keyword">null</span>
&& State.CONNECTED != wifiState
&& State.CONNECTED != mobileState) {<span class="hljs-comment">// 手机没有任何的网络  </span>
Log.d(TAG1, <span class="hljs-string">"手机没有任何的网络"</span>);

APP.getInstance().setMobile(<span class="hljs-keyword">false</span>);
APP.getInstance().setWifi(<span class="hljs-keyword">false</span>);
APP.getInstance().setConnected(<span class="hljs-keyword">false</span>);

}

</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li></ul>

第二种方法

<code class="language-java hljs  has-numbering">ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
Log.i(TAG1, <span class="hljs-string">"CONNECTIVITY_ACTION"</span>);

NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
<span class="hljs-keyword">if</span> (activeNetwork != <span class="hljs-keyword">null</span>) { <span class="hljs-comment">// connected to the internet</span>
<span class="hljs-keyword">if</span> (activeNetwork.isConnected()) {
<span class="hljs-keyword">if</span> (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
<span class="hljs-comment">// connected to wifi</span>
APP.getInstance().setWifi(<span class="hljs-keyword">true</span>);
Log.e(TAG, <span class="hljs-string">"当前WiFi连接可用 "</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
<span class="hljs-comment">// connected to the mobile provider's data plan</span>
APP.getInstance().setMobile(<span class="hljs-keyword">true</span>);
Log.e(TAG, <span class="hljs-string">"当前移动网络连接可用 "</span>);
}
} <span class="hljs-keyword">else</span> {
Log.e(TAG, <span class="hljs-string">"当前没有网络连接,请确保你已经打开网络 "</span>);
}
} <span class="hljs-keyword">else</span> {   <span class="hljs-comment">// not connected to the internet</span>
Log.e(TAG, <span class="hljs-string">"当前没有网络连接,请确保你已经打开网络 "</span>);
APP.getInstance().setWifi(<span class="hljs-keyword">false</span>);
APP.getInstance().setMobile(<span class="hljs-keyword">false</span>);
APP.getInstance().setConnected(<span class="hljs-keyword">false</span>);

}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li></ul>

网络错误情况的处理

正如前面所提到的,这篇博客吧网络错误主要分为两大类

- 没有网络情况的错误

- 在有网络的情况下,我们客户端的错误或者服务器端的错误

在这里 我们主要处理没有网络情况下的错误,现在 个人了解到 的主要有两种处理方法。

第一种做法:

在APP启动的 时候检查当前是否已经连接上网络,弹出一个对话框没有的话跳转到设置界面或者WiFi设置界面或者打开移动网络界面 。

第二种方法

其实跟第一种做法差不多,只是在每一次 错误的情况下,都会判断当前有没有 网络 ,没有弹出一个对话框,跳转到设置界面或者WiFi设置界面或者打开移动网络界面 , 下面我们我们一起来看一下 怎样弹出一个对话框,并且跳转到相应的设置界面

这里我们采取第一种做法,效果图如下



代码如下

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">showWifiDlg</span>(<span class="hljs-keyword">final</span> Context context) {
AlertDialog.Builder builder = <span class="hljs-keyword">new</span> AlertDialog.Builder(context.getApplicationContext());
<span class="hljs-keyword">if</span> (mWifiDialog == <span class="hljs-keyword">null</span>) {
mWifiDialog = builder.setIcon(R.drawable.ic_launcher)         <span class="hljs-comment">//</span>
.setTitle(<span class="hljs-string">"wifi设置"</span>)            <span class="hljs-comment">//</span>
.setMessage(<span class="hljs-string">"当前无网络"</span>).setPositiveButton(<span class="hljs-string">"设置"</span>, <span class="hljs-keyword">new</span> DialogInterface
.OnClickListener() {

<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(DialogInterface dialog, <span class="hljs-keyword">int</span> which) {
<span class="hljs-comment">// 跳转到系统的网络设置界面</span>
Intent intent = <span class="hljs-keyword">null</span>;
<span class="hljs-comment">// 先判断当前系统版本</span>
<span class="hljs-keyword">if</span> (android.os.Build.VERSION.SDK_INT > <span class="hljs-number">10</span>) {  <span class="hljs-comment">// 3.0以上</span>
intent = <span class="hljs-keyword">new</span> Intent(android.provider.Settings
.ACTION_WIFI_SETTINGS);
} <span class="hljs-keyword">else</span> {
intent = <span class="hljs-keyword">new</span> Intent();
intent.setClassName(<span class="hljs-string">"com.android.settings"</span>,
Settings.ACTION_WIFI_SETTINGS);
}
<span class="hljs-keyword">if</span> ((context <span class="hljs-keyword">instanceof</span> Application)) {
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);

}
}).setNegativeButton(<span class="hljs-string">"知道了"</span>, <span class="hljs-keyword">null</span>).create();
<span class="hljs-comment">// 设置为系统的Dialog,这样使用Application的时候不会 报错</span>
mWifiDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
mWifiDialog.show();

}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li></ul>

这里对几个 重要的 Action说一下

ACTION_DATA_ROAMING_SETTINGS : 跳转到移动网络设置界面
ACTION_WIFI_SETTINGS

Activity Action: Show settings to allow configuration of Wi-Fi.
ACTION_WIRELESS_SETTINGS

Activity Action: Show settings to allow configuration of wireless controls such as Wi-Fi, Bluetooth and Mobile networks.
关于更多Activity Action,请参考官网地址

需要注意的是

若我们 使用的Context不是Activity 的Context 而是Application的 Context,我们 需要做以下处理 ,否则会报错

<code class="language-java hljs  has-numbering"><span class="hljs-comment">// 设置为系统级别的Dialog</span>
mWifiDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

<span class="hljs-keyword">if</span> ((context <span class="hljs-keyword">instanceof</span> Application)) {                            intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);

在AndroidMainFest中添加以下权限 。
<!--允许 弹出系统级别的AlterDialog-->
<uses-permission android:name=<span class="hljs-string">"android.permission.SYSTEM_ALERT_WINDOW"</span>/>
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

智能无图

智能无图,这种浏览模式我们平时 很常见,比如在UC浏览器中,网易新闻中都有看到这种模式,这种模式的实质就是监听网络状态,再根据是否是WiFi去确定是否加载网络图片。

效果图如下

我们可以看到在开启智能无图的情况下,若不是连接WiFi ,我们是不会去加载网络图片的。



实现的核心代码如下

1)当智能无图模式变化的时候,我们会把标志存进SharePreferences中

<code class="language-java hljs  has-numbering">mSwitchWifiPic.setOnCheckedChangeListener(<span class="hljs-keyword">new</span> CompoundButton.OnCheckedChangeListener() {
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCheckedChanged</span>(CompoundButton buttonView, <span class="hljs-keyword">boolean</span> isChecked) {

SPUtils.put(SPConstants.isIntelligentNoPic,isChecked);

}
});
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

同时我们为了进来的时候界面与SharePreferences中的 isIntelligentNoPic的值保持一致,我们需要调用一下代码

<code class="hljs avrasm has-numbering">boolean isIntelligentNoPic = SPUtils<span class="hljs-preprocessor">.getBoolean</span>(SPConstants<span class="hljs-preprocessor">.isIntelligentNoPic</span>)<span class="hljs-comment">;</span>
mSwitchWifiPic<span class="hljs-preprocessor">.setChecked</span>(isIntelligentNoPic)<span class="hljs-comment">;</span>
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

2)在NewsListAdapter中

<code class="language-java hljs  has-numbering"><span class="hljs-comment">// 是否开启智能无图模式,true表示开启智能无图模式</span>
<span class="hljs-keyword">boolean</span> isIntelligentNoPic = SPUtils.getBoolean(Constants.SPConstants.isIntelligentNoPic);
WriteLogUtil.i(<span class="hljs-string">"isIntelligentNoPic="</span> + isIntelligentNoPic);
<span class="hljs-keyword">if</span> (isIntelligentNoPic) {
<span class="hljs-keyword">if</span> (APP.getInstance().isWifi()) {
GlideUtils.display(mContext, iv, picUrl);
} <span class="hljs-keyword">else</span> {
iv.setImageDrawable(<span class="hljs-keyword">new</span> ColorDrawable(Color.GRAY));
}

} <span class="hljs-keyword">else</span> {
GlideUtils.display(mContext, iv, picUrl);
}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>

至于APP.getInstance().isWifi()表示当前是否连接WiFi,是通过 监听广播实现的 ,前面已经说明了,这里就不再阐述了。

拓展工具类

以下工具类参考Android获取网络状态

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NetStateUtils</span> {</span>

<span class="hljs-javadoc">/**
* 判断当前网络是否是移动网络
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span> boolean
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">is3G</span>(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
<span class="hljs-keyword">if</span> (activeNetInfo != <span class="hljs-keyword">null</span>
&& activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}

<span class="hljs-javadoc">/**
* 判断当前网络是否是wifi网络
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span> boolean
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isWifi</span>(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
<span class="hljs-keyword">if</span> (activeNetInfo != <span class="hljs-keyword">null</span>
&& activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}

<span class="hljs-javadoc">/**
* 判断当前网络是否是2G网络
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span> boolean
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">is2G</span>(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
<span class="hljs-keyword">if</span> (activeNetInfo != <span class="hljs-keyword">null</span>
&& (activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE
|| activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS || activeNetInfo
.getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA)) {
<span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}

<span class="hljs-javadoc">/**
* wifi是否打开
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isWifiEnabled</span>(Context context) {
ConnectivityManager mgrConn = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
TelephonyManager mgrTel = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
<span class="hljs-keyword">return</span> ((mgrConn.getActiveNetworkInfo() != <span class="hljs-keyword">null</span> && mgrConn
.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel
.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS);
}

<span class="hljs-javadoc">/**
* 判断是否有网络连接
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isNetworkConnected</span>(Context context) {
<span class="hljs-keyword">if</span> (context != <span class="hljs-keyword">null</span>) {
<span class="hljs-comment">// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)</span>
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
.CONNECTIVITY_SERVICE);
<span class="hljs-comment">// 获取NetworkInfo对象</span>
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
<span class="hljs-comment">//判断NetworkInfo对象是否为空</span>
<span class="hljs-keyword">if</span> (networkInfo != <span class="hljs-keyword">null</span>)
<span class="hljs-keyword">return</span> networkInfo.isAvailable();
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}

<span class="hljs-javadoc">/**
* 判断MOBILE网络是否可用
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isMobileConnected</span>(Context context) {
<span class="hljs-keyword">if</span> (context != <span class="hljs-keyword">null</span>) {
<span class="hljs-comment">//获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)</span>
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
.CONNECTIVITY_SERVICE);
<span class="hljs-comment">//获取NetworkInfo对象</span>
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
<span class="hljs-comment">//判断NetworkInfo对象是否为空 并且类型是否为MOBILE</span>
<span class="hljs-keyword">if</span> (networkInfo != <span class="hljs-keyword">null</span> && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
<span class="hljs-keyword">return</span> networkInfo.isAvailable();
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
}

<span class="hljs-javadoc">/**
* 获取当前网络连接的类型信息
* 原生
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getConnectedType</span>(Context context) {
<span class="hljs-keyword">if</span> (context != <span class="hljs-keyword">null</span>) {
<span class="hljs-comment">//获取手机所有连接管理对象</span>
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
.CONNECTIVITY_SERVICE);
<span class="hljs-comment">//获取NetworkInfo对象</span>
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
<span class="hljs-keyword">if</span> (networkInfo != <span class="hljs-keyword">null</span> && networkInfo.isAvailable()) {
<span class="hljs-comment">//返回NetworkInfo的类型</span>
<span class="hljs-keyword">return</span> networkInfo.getType();
}
}
<span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;
}

<span class="hljs-javadoc">/**
* 获取当前的网络状态 :没有网络-0:WIFI网络1:4G网络-4:3G网络-3:2G网络-2
* 自定义
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAPNType</span>(Context context) {
<span class="hljs-comment">//结果返回值</span>
<span class="hljs-keyword">int</span> netType = <span class="hljs-number">0</span>;
<span class="hljs-comment">//获取手机所有连接管理对象</span>
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
.CONNECTIVITY_SERVICE);
<span class="hljs-comment">//获取NetworkInfo对象</span>
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
<span class="hljs-comment">//NetworkInfo对象为空 则代表没有网络</span>
<span class="hljs-keyword">if</span> (networkInfo == <span class="hljs-keyword">null</span>) {
<span class="hljs-keyword">return</span> netType;
}
<span class="hljs-comment">//否则 NetworkInfo对象不为空 则获取该networkInfo的类型</span>
<span class="hljs-keyword">int</span> nType = networkInfo.getType();
<span class="hljs-keyword">if</span> (nType == ConnectivityManager.TYPE_WIFI) {
<span class="hljs-comment">//WIFI</span>
netType = <span class="hljs-number">1</span>;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (nType == ConnectivityManager.TYPE_MOBILE) {
<span class="hljs-keyword">int</span> nSubType = networkInfo.getSubtype();
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService
(Context.TELEPHONY_SERVICE);
<span class="hljs-comment">//3G   联通的3G为UMTS或HSDPA 电信的3G为EVDO</span>
<span class="hljs-keyword">if</span> (nSubType == TelephonyManager.NETWORK_TYPE_LTE
&& !telephonyManager.isNetworkRoaming()) {
netType = <span class="hljs-number">4</span>;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (nSubType == TelephonyManager.NETWORK_TYPE_UMTS
|| nSubType == TelephonyManager.NETWORK_TYPE_HSDPA
|| nSubType == TelephonyManager.NETWORK_TYPE_EVDO_0
&& !telephonyManager.isNetworkRoaming()) {
netType = <span class="hljs-number">3</span>;
<span class="hljs-comment">//2G 移动和联通的2G为GPRS或EGDE,电信的2G为CDMA</span>
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (nSubType == TelephonyManager.NETWORK_TYPE_GPRS
|| nSubType == TelephonyManager.NETWORK_TYPE_EDGE
|| nSubType == TelephonyManager.NETWORK_TYPE_CDMA
&& !telephonyManager.isNetworkRoaming()) {
netType = <span class="hljs-number">2</span>;
} <span class="hljs-keyword">else</span> {
netType = <span class="hljs-number">2</span>;
}
}
<span class="hljs-keyword">return</span> netType;
}

<span class="hljs-javadoc">/**
* 判断GPS是否打开
* ACCESS_FINE_LOCATION权限
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isGPSEnabled</span>(Context context) {
<span class="hljs-comment">//获取手机所有连接LOCATION_SERVICE对象</span>
LocationManager locationManager = ((LocationManager) context.getSystemService(Context
.LOCATION_SERVICE));
<span class="hljs-keyword">return</span> locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

<span class="hljs-javadoc">/**
* 获得本机ip地址
*
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">GetHostIp</span>() {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">for</span> (Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
<span class="hljs-keyword">for</span> (Enumeration<InetAddress> ipAddr = intf.getInetAddresses(); ipAddr
.hasMoreElements(); ) {
InetAddress inetAddress = ipAddr.nextElement();
<span class="hljs-keyword">if</span> (!inetAddress.isLoopbackAddress()) {
<span class="hljs-keyword">return</span> inetAddress.getHostAddress();
}
}
}
} <span class="hljs-keyword">catch</span> (SocketException ex) {
} <span class="hljs-keyword">catch</span> (Exception e) {
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}

<span class="hljs-javadoc">/**
* 获取本机串号imei
*
*<span class="hljs-javadoctag"> @param</span> context
*<span class="hljs-javadoctag"> @return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">getIMEI</span>(Context context) {
TelephonyManager telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
<span class="hljs-keyword">return</span> telephonyManager.getDeviceId();
}

<span class="hljs-javadoc">/***
* 判断是否有外网连接(普通方法不能判断外网的网络是否连接,比如连接上局域网)
*
*<span class="hljs-javadoctag"> @return</span>
*/</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">ping</span>() {

String result = <span class="hljs-keyword">null</span>;
<span class="hljs-keyword">try</span> {
String ip = <span class="hljs-string">"www.baidu.com"</span>;<span class="hljs-comment">// ping 的地址,可以换成任何一种可靠的外网</span>
Process p = Runtime.getRuntime().exec(<span class="hljs-string">"ping -c 3 -w 100 "</span> + ip);<span class="hljs-comment">// ping网址3次</span>
<span class="hljs-comment">// 读取ping的内容,可以不加</span>
InputStream input = p.getInputStream();
BufferedReader in = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(input));
StringBuffer stringBuffer = <span class="hljs-keyword">new</span> StringBuffer();
String content = <span class="hljs-string">""</span>;
<span class="hljs-keyword">while</span> ((content = in.readLine()) != <span class="hljs-keyword">null</span>) {
stringBuffer.append(content);
}
Log.d(<span class="hljs-string">"------ping-----"</span>, <span class="hljs-string">"result content : "</span> + stringBuffer.toString());
<span class="hljs-comment">// ping的状态</span>
<span class="hljs-keyword">int</span> status = p.waitFor();
<span class="hljs-keyword">if</span> (status == <span class="hljs-number">0</span>) {
result = <span class="hljs-string">"success"</span>;
<span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
} <span class="hljs-keyword">else</span> {
result = <span class="hljs-string">"failed"</span>;
}
} <span class="hljs-keyword">catch</span> (IOException e) {
result = <span class="hljs-string">"IOException"</span>;
} <span class="hljs-keyword">catch</span> (InterruptedException e) {
result = <span class="hljs-string">"InterruptedException"</span>;
} <span class="hljs-keyword">finally</span> {
Log.d(<span class="hljs-string">"----result---"</span>, <span class="hljs-string">"result = "</span> + result);
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;

}
}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li><li>164</li><li>165</li><li>166</li><li>167</li><li>168</li><li>169</li><li>170</li><li>171</li><li>172</li><li>173</li><li>174</li><li>175</li><li>176</li><li>177</li><li>178</li><li>179</li><li>180</li><li>181</li><li>182</li><li>183</li><li>184</li><li>185</li><li>186</li><li>187</li><li>188</li><li>189</li><li>190</li><li>191</li><li>192</li><li>193</li><li>194</li><li>195</li><li>196</li><li>197</li><li>198</li><li>199</li><li>200</li><li>201</li><li>202</li><li>203</li><li>204</li><li>205</li><li>206</li><li>207</li><li>208</li><li>209</li><li>210</li><li>211</li><li>212</li><li>213</li><li>214</li><li>215</li><li>216</li><li>217</li><li>218</li><li>219</li><li>220</li><li>221</li><li>222</li><li>223</li><li>224</li><li>225</li><li>226</li><li>227</li><li>228</li><li>229</li><li>230</li><li>231</li><li>232</li><li>233</li><li>234</li><li>235</li><li>236</li><li>237</li><li>238</li><li>239</li><li>240</li><li>241</li><li>242</li><li>243</li><li>244</li><li>245</li><li>246</li><li>247</li><li>248</li><li>249</li><li>250</li><li>251</li><li>252</li><li>253</li><li>254</li><li>255</li><li>256</li><li>257</li><li>258</li><li>259</li><li>260</li><li>261</li><li>262</li><li>263</li><li>264</li><li>265</li><li>266</li><li>267</li><li>268</li><li>269</li><li>270</li><li>271</li><li>272</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li><li>164</li><li>165</li><li>166</li><li>167</li><li>168</li><li>169</li><li>170</li><li>171</li><li>172</li><li>173</li><li>174</li><li>175</li><li>176</li><li>177</li><li>178</li><li>179</li><li>180</li><li>181</li><li>182</li><li>183</li><li>184</li><li>185</li><li>186</li><li>187</li><li>188</li><li>189</li><li>190</li><li>191</li><li>192</li><li>193</li><li>194</li><li>195</li><li>196</li><li>197</li><li>198</li><li>199</li><li>200</li><li>201</li><li>202</li><li>203</li><li>204</li><li>205</li><li>206</li><li>207</li><li>208</li><li>209</li><li>210</li><li>211</li><li>212</li><li>213</li><li>214</li><li>215</li><li>216</li><li>217</li><li>218</li><li>219</li><li>220</li><li>221</li><li>222</li><li>223</li><li>224</li><li>225</li><li>226</li><li>227</li><li>228</li><li>229</li><li>230</li><li>231</li><li>232</li><li>233</li><li>234</li><li>235</li><li>236</li><li>237</li><li>238</li><li>239</li><li>240</li><li>241</li><li>242</li><li>243</li><li>244</li><li>245</li><li>246</li><li>247</li><li>248</li><li>249</li><li>250</li><li>251</li><li>252</li><li>253</li><li>254</li><li>255</li><li>256</li><li>257</li><li>258</li><li>259</li><li>260</li><li>261</li><li>262</li><li>263</li><li>264</li><li>265</li><li>266</li><li>267</li><li>268</li><li>269</li><li>270</li><li>271</li><li>272</li></ul>

转载请注明博客地址:http://blog.csdn.Net/gdutxiaoxu/article/details/53008266

源码下载地址:https://github.com/gdutxiaoxu/FunAPP.Git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: