我想以编程方式检查Android手机/模拟器中是否存在互联网连接。因此,一旦我确定存在互联网连接,那么我将打电话给互联网。
所以它就像“嘿模拟器!如果你有互联网连接,那么请打开这个页面,否则doSomeThingElse();”
答案 0 :(得分:26)
我为自己实施的方法:
/*
* isOnline - Check if there is a NetworkConnection
* @return boolean
*/
protected boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
return true;
} else {
return false;
}
}
请注意这是NetworkConnection-Check。如果有NetworkConnection,则不必是InternetConnection。
答案 1 :(得分:11)
连接到网络并不能保证互联网连接。
您可能已连接到家中的wifi,但您可能没有互联网连接。 或者,您可能在餐厅,您可以连接到wifi,但仍然需要热点的密码才能使用互联网。在这种情况下,上述方法将返回true,但设备不会有互联网,如果没有正确的尝试和捕获,应用程序可能会崩溃。
底线,网络连接并不意味着互联网连接,它只是意味着您设备的无线硬件可以连接到另一台主机,并且两者都可以建立连接。
以下是一种方法,可以检查设备是否可以连接到网站并相应地返回答案。
if (networkConnectivity())
{
try
{
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(3000); //choose your own timeframe
urlc.setReadTimeout(4000); //choose your own timeframe
urlc.connect();
networkcode2 = urlc.getResponseCode();
return (urlc.getResponseCode() == 200);
} catch (IOException e)
{
return (false); //connectivity exists, but no internet.
}
} else
{
return false; //no connectivity
}
答案 2 :(得分:6)
至于问题标题,你想检查互联网访问,
所以最快的方式,至少目前是有效的,
根据他的回答levit ,thnx到https://stackoverflow.com/a/27312494/3818437
如果您只是想检查与任何网络的连接 - 而不是关心 如果互联网可用 - 那么这里的大多数答案(包括 接受的),实现isConnectedOrConnecting()将很好地工作。 如果你想知道你是否有互联网连接(如 问题标题表示)请阅读Ping的主要名称 服务器
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
} catch (IOException e) { e.printStackTrace(); }
catch (InterruptedException e) { e.printStackTrace(); }
return false; }
就是这样!是的,简短,是的,它很快,不需要在后台运行,不需要root权限。
可能的问题
这真的够快吗?
是的,非常快!
是否真的没有可靠的方法来检查互联网是否可用, 除了在互联网上测试一些东西?
据我所知,但请告诉我,我会编辑我的答案。
难道我不能ping我自己的页面,我想要请求吗?
当然!如果你想区分,你甚至可以检查两者 “互联网连接可用”,您自己的服务器可以访问
如果DNS关闭怎么办?
Google DNS(例如8.8.8.8)是中国最大的公共DNS服务 世界。截至2013年,它每天为1300亿个请求提供服务。我们就这样吧 说,你的应用程序没有响应可能不会是谈论 一天。
需要哪些权限?
只是 互联网接入 - 什么惊喜^^(顺便说一句,你有没有想过, 这里建议的一些方法甚至可以使用远程胶水 关于互联网的可用性,未经此许可?)
答案 3 :(得分:3)
我一直在使用这两种方法来检查互联网状态 有时 https 协议无法使用 http 协议
// Check if network is available
public static boolean isNetworkAvailable() {
ConnectivityManager cm = (ConnectivityManager)
AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
// ping the google server to check if internet is really working or not
public static boolean isInternetWorking() {
boolean success = false;
try {
URL url = new URL("https://google.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(10000);
connection.connect();
success = connection.getResponseCode() == 200;
} catch (IOException e) {
e.printStackTrace();
}
return success;
}
答案 4 :(得分:2)
试试这个:
ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING ) {
text.setText("hey your online!!!") ;
//Do something in here when we are connected
} else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) {
text.setText("Look your not online");
}
答案 5 :(得分:0)
因为你连接到网络并不保证你有互联网,所以我只是在try catch块里面打电话给互联网。然后捕获UnknownHostException以处理无互联网。
答案 6 :(得分:0)
来自我的OLD Answer here
试试这个
我已经应用了@Levit提供的解决方案并创建了不会调用额外Http请求的函数。
它将解决错误Unable to Resolve Host
public static boolean isInternetAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork == null) return false;
switch (activeNetwork.getType()) {
case ConnectivityManager.TYPE_WIFI:
if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
isInternet())
return true;
break;
case ConnectivityManager.TYPE_MOBILE:
if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED ||
activeNetwork.getState() == NetworkInfo.State.CONNECTING) &&
isInternet())
return true;
break;
default:
return false;
}
return false;
}
private static boolean isInternet() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
Debug.i(exitValue + "");
return (exitValue == 0);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return false;
}
现在称之为,
if (!isInternetAvailable(getActivity())) {
//Show message
} else {
//Perfoem the api request
}
答案 7 :(得分:0)
此代码必须在后台线程中运行
fun hasActiveInternetConnection(): Boolean {
return try {
val ipAddr: InetAddress = InetAddress.getByName("google.com")
!ipAddr.equals("")
} catch (e: java.lang.Exception) {
false
}
}