百度搜索 如何判斷android網絡是否可用,會有一大堆的結果。
但是最終結底還是用networkInfo.isAvailable來判斷的,但是經過我的實驗,我發現此方法只是判斷手機聯網狀態是否就緒,而不是真的判斷忘絡是否已經鏈接。
下面貼出我的測試經過。
測試機型:華為榮耀3C ROM miui v6(其他機型是否如此有待驗證,且真機和虛擬的結果肯定是有出入,所以這方面最好用真機來測試)
測試代碼:
//AndroidManifest.xml中需加入權限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] networkInfos = cm.getAllNetworkInfo(); for (NetworkInfo info : networkInfos) { Log.i("AAA", info.getTypeName() + " is connected " + info.isConnected() + " isAvailable " + info.isAvailable()); } NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null) Log.i("AAA", "network type is " + info.getTypeName() + " network is available " + info.isAvailable() + " network is connected " + info.isConnected());
測試經過:
第一步:WIFI打開並連接網絡,數據開關打開。打印結果:
mobile is connected false isAvailable true WIFI is connected true isAvailable true mobile_mms is connected false isAvailable true mobile_supl is connected false isAvailable true mobile_dun is connected false isAvailable true mobile_hipri is connected false isAvailable true BLUETOOTH_TETHER is connected false isAvailable false ETHERNET is connected false isAvailable false mobile_fota is connected false isAvailable true mobile_ims is connected false isAvailable true mobile_cbs is connected false isAvailable true active network type is WIFI network is available true network is connected true
第二步 :WIFI打開,但是沒有連接網絡,數據開關打開連接數據流量。打印結果:
mobile is connected true isAvailable true WIFI is connected false isAvailable true mobile_mms is connected false isAvailable true mobile_supl is connected false isAvailable true mobile_dun is connected false isAvailable true mobile_hipri is connected false isAvailable true BLUETOOTH_TETHER is connected false isAvailable false ETHERNET is connected false isAvailable false mobile_fota is connected false isAvailable true mobile_ims is connected false isAvailable true mobile_cbs is connected false isAvailable true active network type is mobile network is available true network is connected true
經過上面對比可知:當wifi打開時,數據連接其實是沒有連接的。wifi開關只要是打開的,不管有沒有連接wifi ,wifi都是Available的。
第三步:關閉wifi開關,數據開關開始並已經連接數據流量。 打印結果:
mobile is connected true isAvailable true WIFI is connected false isAvailable false mobile_mms is connected false isAvailable true mobile_supl is connected false isAvailable true mobile_dun is connected false isAvailable true mobile_hipri is connected false isAvailable true BLUETOOTH_TETHER is connected false isAvailable false ETHERNET is connected false isAvailable false mobile_fota is connected false isAvailable true mobile_ims is connected false isAvailable true mobile_cbs is connected false isAvailable true active network type is mobile network is available true network is connected true
結論1:只有當wifi關閉的時候 wifi的available狀態才是false的
第四步:關閉wifi開關和數據開關。打印結果:
mobile is connected false isAvailable true WIFI is connected false isAvailable false mobile_mms is connected false isAvailable true mobile_supl is connected false isAvailable true mobile_dun is connected false isAvailable true mobile_hipri is connected false isAvailable true BLUETOOTH_TETHER is connected false isAvailable false ETHERNET is connected false isAvailable false mobile_fota is connected false isAvailable true mobile_ims is connected false isAvailable true mobile_cbs is connected false isAvailable true
發現,當wifi開關關閉的時候 wifi的available狀態是 false的,但是當關閉數據連接的開關的時候,mobile的連接狀態 isConnected雖然是false但是Available仍然是true的。
而且最后一行Log沒有打出來說明此時getActiveNetworkInfo()的返回值是null
上面的四個步驟都是在手機SIM卡有信號的情況下測試的。也就是說只要打開數據開關數據連接就能連上的情況下測試的。正常情況下應該還要測試當手機卡沒有信號的情況下的結果,但是這種情況不太好模擬,所以我就到
sim卡管理中心把sim給禁用掉了。具體沒有研究過,所以不太清楚這種情況能不能模擬手機沒有信號的情況這個待定。
打印的結果如下:
mobile is connected false isAvailable false WIFI is connected false isAvailable false mobile_mms is connected false isAvailable false mobile_supl is connected false isAvailable false mobile_dun is connected false isAvailable false mobile_hipri is connected false isAvailable false BLUETOOTH_TETHER is connected false isAvailable false ETHERNET is connected false isAvailable false mobile_fota is connected false isAvailable false mobile_ims is connected false isAvailable false mobile_cbs is connected false isAvailable false
不出意外,此時的mobile的available狀態已經成為了false。
其實通過NetworkInfo的api中就可以看出來
isAvailable的解釋是:Indicates whether network connectivity is possible. 表明網絡連接是否posible,posible可能的意思,而並不是已經連接
isConnected():Indicates whether network connectivity exists and it is possible to establish connections and pass data.表明網絡連接是否存在並且可以傳遞數據。
這兩處的連接用的是 connectivity名詞。在此處可以理解為 “建立鏈接”這一事實。(本人英語渣渣般的存在,如果不對,請無視)。
當然百度搜索網絡連接是否可用,給的結果用isAvailable判斷是否可用也無可厚非,因為這個確實是判斷網絡是否可用的,谷歌給出的解釋也是這個意思,只是這個地方的可用只是一種可能性的判斷,是判斷網絡狀態是否已經准備好可以用來建立連接了。
所以,判斷網絡是否已經建立鏈接,並且可以上網了的判斷應該是醬紫的:
public boolean isNetWorkConnected() { boolean isConnected = false; ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeInfo = cm.getActiveNetworkInfo(); if (activeInfo != null && activeInfo.isAvailable() && activeInfo.isConnected()) { isConnected = true; } return isConnected; }
應該就是這樣。
至於像騰訊的那種wifi鏈接上,但是連接像CMCC這種沒有登錄賬號就不能用的wifi后提示網絡不可用的方法。暫時沒有從api中找到思路,不過看到有網友說可以請求一下一個接口,如果TimeOut的話就是wifi不可用,私以為此方法可行,如果你感覺你們的服務器穩定性不是很好,可以背靠大公司呀,向BAT這樣的網站發起一個http請求,如果響應超時,我想一般情況下就是你手機網絡設置的問題了。(當然我大企鵝的肯定沒有這么簡單,他們是有socket連接的,心里默念企鵝大法好,BAT技術的牛逼性大家有目共睹。)
以上。
如果有不對的地方還請指正!
