版权声明:本文为博主原创文章,未经博主允许不得转载。
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