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

来源:互联网 发布:csgo优化fps 编辑:程序博客网 时间:2024/05/21 09:49

目录(?)[+]

  1. android 监听网络状态的变化及实际应用
    1. 实现思路
      1. 使用静态广播还是动态注册广播的方式好呢
    2. 通过广播监听网络状态的两种方法
      1. 静态注册
      2. 动态注册
      3. 我们自定义的NetworkChangeListener广播
      4. 思路解析
    3. ConnectivityManager和NetworkInfo
      1. ConnectivityManager主要用来干什么
      2. 怎样获取ConnectivityManager对象呢
      3. 获取 NetworkInfo对象
    4. 网络错误情况的处理
      1. 代码如下
    5. 智能无图
      1. 效果图如下
      2. 实现的核心代码如下
    6. 拓展工具类

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

0 0
原创粉丝点击