私はandroid
アプリを開発していますが、インターネット接続が存在するかどうかを確認するための最良の方法を知りたいです。connectivity manager
とクラスを使用してみnetworkinfo
ましたが、アプリがネットなしでクラッシュし続けるため、役に立ちませんでしたHttpConnection
。誰かが彼らの貴重な提案をすることができますか?
4 に答える
URL myurl = new URL(url);
URLConnection connection = myurl.openConnection();
connection.setConnectTimeout(20 * 1000);
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = -1;
try {
responseCode = httpConnection.getResponseCode();
} catch (Exception e1) {
throw e1;
}
if (responseCode == HttpURLConnection.HTTP_OK) {
//connection is OK and do what you want
//...
}
else
{
//connection is not OK
httpConnection.disconnect();
}
それは古い質問ですが、私がしていることは、他の人にも役立つようにここで答えることです。以下のようなクラスを作成します。
public class ConnectionDetector {
private Context context;
public ConnectionDetector(Context context) {
this.context = context;
}
public boolean isConnectedToInternet() {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
return false;
}
}
method
次に、からこのようにクラスを呼び出して、activity
接続を確認します。
if(new ConnectionDetector(context).isConnectedToInternet()){
//Connected
//do what you want to do here
} else{
// Not connected
// show appropriate message
}
Udacityの優れた高度なAndroidアプリ開発コースでは、getActiveNetworkInfo()を使用しています
https://www.udacity.com/course/advanced-android-app-development--ud855
/**
* @param context Context used to get the ConnectivityManager
* @return true if network has connectivity (i.e. is reachable), else return false
*/
static public boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return ((activeNetworkInfo != null)
&& activeNetworkInfo.isConnectedOrConnecting());
}
余談ですが、Clairvoyantの良い答えはgetAllNetworkInfoを使用していましたが、APIレベル23では非推奨になりました。
Androidのドキュメントには、代わりにgetAllNetworks()とgetNetworkInfo(android.net.Network)を使用すると記載されています。
http://developer.android.com/reference/android/net/ConnectivityManager.html#getAllNetworkInfo()
Clairvoyantのメソッドを以下のように更新し、Udacityのより単純なisNetworkAvailableメソッドが上に表示されるまで使用しました。
/**
* @return true if network has connectivity (i.e. is reachable), else return false
*/
boolean hasConnectivity(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
Network[] networks = connectivityManager.getAllNetworks();
if ((networks != null)
&& (networks.length > 0)) {
for (Network network : networks) {
NetworkInfo info = connectivityManager.getNetworkInfo(network);
if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return 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) {
//use the function here
onError(this,e);
}
public void onError(Activity activity,Throwable e){
try {
e.printStackTrace();
FirebaseCrash.report(e);
if (e instanceof HttpException) {
Response body = ((HttpException) e).response();
if (body.code() == 401) {
Toast.makeText(activity, "Not Authorized Access", Toast.LENGTH_SHORT).show();
} else if (body.code() == 404) {
Toast.makeText(activity, "Request not found", Toast.LENGTH_SHORT).show();
} else if (body.code() == 400) {
Toast.makeText(activity, "Bad Request", Toast.LENGTH_SHORT).show();
} else if (body.code() == 500) {
Toast.makeText(activity, "Internal Server Error", Toast.LENGTH_SHORT).show();
} else {
Log.e(Constants.TAG, "Error : Code HTTP = " + body.code());
}
}else if(e instanceof ConnectException || e instanceof SocketException){
Toast.makeText(activity, "No Internet Connection", Toast.LENGTH_SHORT).show();
} else if (e instanceof UnknownHostException) {
Toast.makeText(activity, "Make Sure Your Internet Connection is Properly Connected", Toast.LENGTH_SHORT).show();
} else if (e instanceof SSLHandshakeException || e instanceof SSLPeerUnverifiedException) {
Toast.makeText(activity, "Server Connection Problem..Please Try Again", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(activity, "Data Load Error", Toast.LENGTH_SHORT).show();
}
}
catch (Exception ex){
FirebaseCrash.report(e);
e.printStackTrace();
}
}