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);
}
当没有互联网访问时,它总是返回
答案 0 :(得分:2)
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线程上运行。
答案 1 :(得分:1)
您使用的代码仅用于检查您是否连接到wifi。它不会检查wifi是否缓慢。 (没有互联网意味着连接缓慢)。
我尝试使用此代码。在这里,我尝试点击google.com并设置了连接超时值。 如果这里互联网速度很好,那么返回的结果是200.所以我检查结果代码是否为200。如果没有,我会显示网络连接速度慢的警报。在asyntask中使用它,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();
}
答案 2 :(得分:0)
检查以下代码集。
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;
}
答案 3 :(得分:-1)
在寻找了几天并且尝试了各种解决方案之后,有些并不完美,有些过于冗长,下面是LEVIT使用SOCKETS建议的解决方案,这对我来说是完美的。任何对此解决方案进行搜索的人都可以查阅此帖子。 How to check internet access on Android? InetAddress never times out
下面是代码部分,其中包含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" />
答案 4 :(得分:-2)
要检查您是否通过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
}