![](/img/trans.png)
[英]How to check Wifi is connected, but no Internet access in Android
[英]android how to check wifi is connected but no internet connection
android 我的設備已連接 wifi 但如何連接 wifi 但這些沒有互聯網連接
以下是我嘗試檢查是否沒有互聯網連接的代碼
public static boolean isConnectedWifi(Context context) {
NetworkInfo info=null;
if(context!=null){
info= IsNetConnectionAvailable.getNetworkInfo(context);
}
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
當沒有互聯網訪問時它總是返回true
NetworInfo.isAvailable
和NetworkInfo.isConnected
僅表示網絡連接是否可能或存在,它們不能表示連接的情況是否可以訪問公共互聯網,長話短說,它們不能告訴我們設備確實在線。
要檢查設備是否在線,請嘗試以下方法:
第一的:
@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 permission
isOnline = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
} catch (Exception e) {
e.printStackTrace();
}
return isOnline;
}
優點: 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;
}
優點: 1.可以在UI線程上運行; 2.可以ping多次,統計最小/平均/最大延遲時間和丟包率。
弱點:兼容性問題。
第三:
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;
}
優勢:可以在所有設備和 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;
}
優勢: 1.可以在所有設備和API上使用; 2.相對快速准確。
缺點:操作耗時,不能在UI線程上運行。
檢查下面的一組代碼。
public boolean isNetworkAvailable(Context context) {
boolean isOnline = false;
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
NetworkCapabilities capabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
isOnline = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
} else {
NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
isOnline = activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
}
} catch (Exception e) {
e.printStackTrace();
}
return isOnline;
}
您使用的代碼僅用於檢查您是否已連接到 wifi。 它不會檢查該 wifi 是否很慢。 (沒有互聯網意味着連接速度慢)。
我嘗試使用此代碼。 在這里,我嘗試訪問 google.com 並設置了連接超時值。 如果這里網速好,那么返回的結果是200。所以我檢查結果代碼是否是200。 如果沒有,我會顯示互聯網連接速度緩慢的警報。 在異步任務中使用它,並且 onPostExecute() 檢查返回結果的值。
HttpURLConnection urlc = null;
try {
urlc = (HttpURLConnection) (new URL("http://www.google.com")
.openConnection());
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1000); // choose your own timeframe
urlc.setReadTimeout(2000); // choose your own timeframe
try {
urlc.connect();
// returning connection code.
return (urlc.getResponseCode());
} catch (IOException e1) {
e1.printStackTrace();
}
在搜索了幾天並嘗試了各種解決方案之后,有些不完美,有些太長,下面是 LEVIT 使用 SOCKETS 建議的解決方案,這對我來說是完美的。 任何搜索此解決方案的人都可以參考這篇文章。 如何在Android上檢查互聯網訪問? InetAddress 永遠不會超時
下面是代碼的一部分,其中包含 AsyncTask 中的任務示例
class InternetCheck extends AsyncTask<Void,Void,Boolean> {
private Consumer mConsumer;
public interface Consumer { void accept(Boolean internet); }
public InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }
@Override protected 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; } }
@Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}
///////////////////////////////////////////////////////////////////////////////////
// Usage
new InternetCheck(internet -> { /* do something with boolean response */ });
以下是與解決方案相關的摘要可能的問題它真的足夠快嗎?
是的,非常快;-)
除了在互聯網上測試某些東西之外,沒有可靠的方法來檢查互聯網嗎?
據我所知,但讓我知道,我會編輯我的答案。
如果 DNS 關閉怎么辦?
Google DNS(例如 8.8.8.8)是世界上最大的公共 DNS。 截至 2013 年,它每天處理 1300 億個請求。 我們只是說,您的應用程序可能不會成為今天的話題。
需要哪些權限?
<uses-permission android:name="android.permission.INTERNET" />
要檢查您是否通過 Wi-Fi 連接到互聯網,請查看以下代碼段:
NetworkInfo getWifi(){
ConnectivityManager connManager = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return mWifi;
}
檢查它是否連接;
if(getWifi().isConnected()) {
//wi-fi connected
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.