Android 检查当前wifi是否可以有网,可以访问网络
生活随笔
收集整理的這篇文章主要介紹了
Android 检查当前wifi是否可以有网,可以访问网络
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
NetworInfo.isAvailable和NetworkInfo.isConnected只表明網(wǎng)絡連接是否已連上,不能表明連接是否可以訪問互聯(lián)網(wǎng)
要檢查設備是否在線,有以下方法:
第一種:
@TargetApi(Build.VERSION_CODES.M) public static boolean isNetworkOnline1(Context context) {boolean isOnline = false;try {ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkCapabilities capabilities = manager.getNetworkCapabilities(manager.getActiveNetwork()); // need ACCESS_NETWORK_STATE permissionisOnline = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);} catch (Exception e) {e.printStackTrace();}return isOnline; }優(yōu)點: 1.可以在UI線程上運行;2.快速準確。
缺點:需要 API >= 23 和兼容性問題。
第二種:
public static boolean isNetworkOnline2() {boolean isOnline = false;try {Runtime runtime = Runtime.getRuntime();Process p = runtime.exec("ping -c 1 8.8.8.8");int waitFor = p.waitFor();isOnline = waitFor == 0; // only when the waitFor value is zero, the network is online indeed// BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));// String str;// while ((str = br.readLine()) != null) {// System.out.println(str); // you can get the ping detail info from Process.getInputStream()// }} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}return isOnline; }優(yōu)點: 1.可以在UI線程上運行;2.可以多次ping,統(tǒng)計min/avg/max延遲時間和丟包率。
缺點:有些手機不行如三星。
第三種
public static boolean isNetworkOnline3() {boolean isOnline = false;try {URL url = new URL("http://www.google.com"); // or your server address// URL url = new URL("http://www.baidu.com");HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestProperty("Connection", "close");conn.setConnectTimeout(3000);isOnline = conn.getResponseCode() == 200;} catch (IOException e) {e.printStackTrace();}return isOnline; }優(yōu)點:可以在所有設備和 API 上使用。
缺點:操作耗時,不能在UI線程上運行。
第四種
public static boolean isNetworkOnline4() {boolean isOnline = false;try {Socket socket = new Socket();socket.connect(new InetSocketAddress("8.8.8.8", 53), 3000);// socket.connect(new InetSocketAddress("114.114.114.114", 53), 3000);isOnline = true;} catch (IOException e) {e.printStackTrace();}return isOnline; }優(yōu)點:1.可以在所有設備和API上使用;2.相對快速準確。
缺點:操作耗時,不能在UI線程上運行。
本人用的是第四種:
class InternetCheck extends AsyncTask<Void, Void, Boolean> {private Consumer mConsumer;public interface Consumer {void accept(Boolean internet);}public InternetCheck(Consumer consumer) {mConsumer = consumer;execute();}@Overrideprotected Boolean doInBackground(Void... voids) {try {Socket sock = new Socket();sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);sock.close();return true;} catch (IOException e) {return false;}}@Overrideprotected void onPostExecute(Boolean internet) {mConsumer.accept(internet);} } new InternetCheck(new InternetCheck.Consumer() {@Overridepublic void accept(Boolean internet) {if (internet){//}else{//}}});總結(jié)
以上是生活随笔為你收集整理的Android 检查当前wifi是否可以有网,可以访问网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10+NVIDIA GTX 960
- 下一篇: android sina oauth2.