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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值