Androidフォン/エミュレーターにインターネット接続があるかどうかをプログラムで確認したい。そのため、インターネット接続が確立されていることを確認したら、インターネットに電話をかけます。
つまり、「エミュレーターねえ!インターネットに接続している場合は、このページを開いてください。そうでない場合は、doSomeThingElse();」のようになります。
Androidフォン/エミュレーターにインターネット接続があるかどうかをプログラムで確認したい。そのため、インターネット接続が確立されていることを確認したら、インターネットに電話をかけます。
つまり、「エミュレーターねえ!インターネットに接続している場合は、このページを開いてください。そうでない場合は、doSomeThingElse();」のようになります。
私が自分で実装した方法:
/*
* 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 である必要はありません。
ネットワークに接続しても、インターネット接続が保証されるわけではありません。
自宅の Wi-Fi に接続されている可能性がありますが、インターネットに接続していない可能性があります。または、Wi-Fi に接続できるレストランにいる場合でも、インターネットを使用するにはホットスポットのパスワードが必要です。このような場合、上記のメソッドは true を返しますが、デバイスにはインターネットがありません。適切な try と catch で囲まれていない場合、アプリがクラッシュする可能性があります。
要するに、ネットワーク接続はインターネット接続を意味するのではなく、デバイスのワイヤレス ハードウェアが別のホストに接続でき、両方が接続できることを意味するだけです。
以下は、デバイスが Web サイトに接続できるかどうかを確認し、それに応じて応答を返すメソッドです。
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
}
質問タイトルですが、インターネットアクセスを確認したいのですが、
最速の方法であり、少なくとも今のところ効率的です。
彼の答えに基づいて浮上する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; }
それでおしまい!はい、短いです。はい、高速です。バックグラウンドで実行する必要はありません。ルート権限は必要ありません。
考えられる質問
これは本当に十分に速いですか?
はい、とても速いです!
インターネットで何かをテストする以外に、インターネットが利用可能かどうかを確認する信頼できる方法は本当にありますか?
私の知る限りではありませんが、お知らせください。回答を編集します。
とにかくリクエストしたい自分のページに ping を送信することはできませんか?
もちろん!「インターネット接続が利用可能」と自分のサーバーが到達可能であることを区別したい場合は、両方をチェックすることもできます
DNS がダウンした場合はどうなりますか?
Google DNS (例: 8.8.8.8) は、世界最大のパブリック DNS サービスです。2013 年現在、1 日あたり 1,300 億件のリクエストを処理しています。あなたのアプリが応答しないことは、おそらく話題に上らないでしょう。
どの権限が必要ですか?
ただのインターネット アクセス - なんという驚き ^^ (ところで、ここで提案されている方法のいくつかが、この許可なしに、インターネットの可用性についてリモート グルーを持っている可能性があることについて考えたことはありますか?)
これらの 2 つの方法を使用してインターネットの状態を確認していますが、時々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;
}
新しい Android セキュリティが原因で http が機能しない場合、現在はプレーン テキスト通信が許可されていません。今のところ、それをバイパスするだけです。
android:usesCleartextTraffic="true"
これを試して:
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");
}
あなたがネットワークに接続されていても、インターネットがあることを保証するものではないため、try catch ブロック内でインターネットへの呼び出しを行っただけです。次に、UnknownHostException をキャッチして、インターネットを処理しません。
このコードはバックグラウンド スレッドで実行する必要があります
fun hasActiveInternetConnection(): Boolean {
return try {
val ipAddr: InetAddress = InetAddress.getByName("google.com")
!ipAddr.equals("")
} catch (e: java.lang.Exception) {
false
}
}