Для Android проверить подключение к интернету [дубликат]
этот вопрос уже есть ответ здесь:
Как проверить доступ в интернет на Android? InetAddress не раз
49 ответы
Я хочу создать приложение, которое использует интернет, и я пытаюсь создать функцию, которая проверяет, доступно ли соединение, а если нет, перейдите к действию, которое имеет кнопку повтора и объяснение.
прилагается мой код до сих пор, но я получаю ошибку Syntax error, insert "}" to complete MethodBody.
теперь я помещаю их в попытке заставить его работать, но до сих пор не повезло... Любая помощь будет оценена по достоинству.
public class TheEvoStikLeagueActivity extends Activity {
private final int SPLASH_DISPLAY_LENGHT = 3000;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
private boolean checkInternetConnection() {
ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
// ARE WE CONNECTED TO THE NET
if (conMgr.getActiveNetworkInfo() != null
&& conMgr.getActiveNetworkInfo().isAvailable()
&& conMgr.getActiveNetworkInfo().isConnected()) {
return true;
/* New Handler to start the Menu-Activity
* and close this Splash-Screen after some seconds.*/
new Handler().postDelayed(new Runnable() {
public void run() {
/* Create an Intent that will start the Menu-Activity. */
Intent mainIntent = new Intent(TheEvoStikLeagueActivity.this, IntroActivity.class);
TheEvoStikLeagueActivity.this.startActivity(mainIntent);
TheEvoStikLeagueActivity.this.finish();
}
}, SPLASH_DISPLAY_LENGHT);
} else {
return false;
Intent connectionIntent = new Intent(TheEvoStikLeagueActivity.this, HomeActivity.class);
TheEvoStikLeagueActivity.this.startActivity(connectionIntent);
TheEvoStikLeagueActivity.this.finish();
}
}
}
20 ответов:
этот метод проверяет, подключен ли мобильный телефон к интернету и возвращает true, если он подключен:
private boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo() != null; }в манифесте,
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />Edit: Этот метод фактически проверяет, подключено ли устройство к интернету (есть возможность, что оно подключено к сети, но не к интернету).
public boolean isInternetAvailable() { try { InetAddress ipAddr = InetAddress.getByName("google.com"); //You can replace it with your name return !ipAddr.equals(""); } catch (Exception e) { return false; } }
убедитесь, что он "подключен" к сети:
public boolean isNetworkAvailable(Context context) { final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); }убедитесь, что он "подключен" к сети:
public boolean isInternetAvailable() { try { final InetAddress address = InetAddress.getByName("www.google.com"); return !address.equals(""); } catch (UnknownHostException e) { // Log error } return false; }разрешения, необходимые:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
вы можете просто пинговать онлайн-сайт, как google:
public boolean isConnected() throws InterruptedException, IOException { String command = "ping -c 1 google.com"; return (Runtime.getRuntime().exec(command).waitFor() == 0); }
вышеуказанные методы работают, когда вы подключены к источнику Wi-Fi или через пакеты данных сотового телефона. Но в случае подключения Wi-Fi есть случаи, когда вас дополнительно просят войти в систему, как в кафе. Так что в этом случае ваше приложение не удастся, как вы подключены к источнику Wi-Fi, но не с Интернетом.
этот метод работает отлично.
public static boolean isConnected(Context context) { ConnectivityManager cm = (ConnectivityManager)context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnected()) { try { URL url = new URL("http://www.google.com/"); HttpURLConnection urlc = (HttpURLConnection)url.openConnection(); urlc.setRequestProperty("User-Agent", "test"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(1000); // mTimeout is in seconds urlc.connect(); if (urlc.getResponseCode() == 200) { return true; } else { return false; } } catch (IOException e) { Log.i("warning", "Error checking internet connection", e); return false; } } return false; }пожалуйста, используйте это в отдельном потоке от основного потока, как это делает сетевой вызов и будет бросать NetwrokOnMainThreadException если не следовать.
а также не помещайте этот метод в onCreate или любой другой метод. Поместите его в класс и получите к нему доступ.
редактирование принятого ответа показывает, как проверить, можно ли что-то в интернете. Мне пришлось слишком долго ждать ответа, когда это было не так (с Wi-Fi, который не имеет подключения к интернету). К Сожалению InetAddress.getByName не имеет параметра timeout, поэтому следующий код работает вокруг этого:
private boolean internetConnectionAvailable(int timeOut) { InetAddress inetAddress = null; try { Future<InetAddress> future = Executors.newSingleThreadExecutor().submit(new Callable<InetAddress>() { @Override public InetAddress call() { try { return InetAddress.getByName("google.com"); } catch (UnknownHostException e) { return null; } } }); inetAddress = future.get(timeOut, TimeUnit.MILLISECONDS); future.cancel(true); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { } return inetAddress!=null && !inetAddress.equals(""); }
вы не можете создать метод внутри другого метода, перемещение
private boolean checkInternetConnection() {способ изonCreate
вы можете использовать следующий фрагмент для проверки подключения к интернету.
это будет полезно в обоих случаях, что вы можете проверить, какие тип сеть Соединение доступно, так что вы можете сделать свой процесс на этом пути.
вы просто должны скопировать следующий класс и вставить непосредственно в пакет.
/** * * @author Pratik Butani * */ public class InternetConnection { /** CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT */ public static boolean checkConnection(Context context) { final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo(); if (activeNetworkInfo != null) { // connected to the internet Toast.makeText(context, activeNetworkInfo.getTypeName(), Toast.LENGTH_SHORT).show(); if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) { // connected to wifi return true; } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { // connected to the mobile provider's data plan return true; } } return false; } }Теперь вы можете использовать как:
if (InternetConnection.checkConnection(context)) { // Its Available... } else { // Not Available... }Не забудьте взять разрешение :) :)
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />вы можете изменить на основе ваших требований.
спасибо.
все официальные методы только говорит, открыто ли устройство для сети или нет,
если ваше устройство подключено к Wi-Fi, но Wifi не подключен к интернету, то этот метод не будет работать (что происходит много раз), никакой встроенный метод обнаружения сети не расскажет об этом сценарии, поэтому созданный асинхронный класс обратного вызова, который вернется в onConnectionSuccess и onConnectionFailnew CheckNetworkConnection(this, new CheckNetworkConnection.OnConnectionCallback() { @Override public void onConnectionSuccess() { Toast.makeText(context, "onSuccess()", toast.LENGTH_SHORT).show(); } @Override public void onConnectionFail(String msg) { Toast.makeText(context, "onFail()", toast.LENGTH_SHORT).show(); } }).execute();сетевой вызов из асинхронного режима Задача
public class CheckNetworkConnection extends AsyncTask<Void, Void, Boolean> { private OnConnectionCallback onConnectionCallback; private Context context; public CheckNetworkConnection(Context con, OnConnectionCallback onConnectionCallback) { super(); this.onConnectionCallback = onConnectionCallback; this.context = con; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Boolean doInBackground(Void... params) { if (context == null) return false; boolean isConnected = new NetWorkInfoUtility().isNetWorkAvailableNow(context); return isConnected; } @Override protected void onPostExecute(Boolean b) { super.onPostExecute(b); if (b) { onConnectionCallback.onConnectionSuccess(); } else { String msg = "No Internet Connection"; if (context == null) msg = "Context is null"; onConnectionCallback.onConnectionFail(msg); } } public interface OnConnectionCallback { void onConnectionSuccess(); void onConnectionFail(String errorMsg); } }фактический класс, который будет пинговать на сервер
class NetWorkInfoUtility { public boolean isWifiEnable() { return isWifiEnable; } public void setIsWifiEnable(boolean isWifiEnable) { this.isWifiEnable = isWifiEnable; } public boolean isMobileNetworkAvailable() { return isMobileNetworkAvailable; } public void setIsMobileNetworkAvailable(boolean isMobileNetworkAvailable) { this.isMobileNetworkAvailable = isMobileNetworkAvailable; } private boolean isWifiEnable = false; private boolean isMobileNetworkAvailable = false; public boolean isNetWorkAvailableNow(Context context) { boolean isNetworkAvailable = false; ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); setIsWifiEnable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()); setIsMobileNetworkAvailable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected()); if (isWifiEnable() || isMobileNetworkAvailable()) { /*Sometime wifi is connected but service provider never connected to internet so cross check one more time*/ if (isOnline()) isNetworkAvailable = true; } return isNetworkAvailable; } public boolean isOnline() { /*Just to check Time delay*/ long t = Calendar.getInstance().getTimeInMillis(); Runtime runtime = Runtime.getRuntime(); try { /*Pinging to Google server*/ 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(); } finally { long t2 = Calendar.getInstance().getTimeInMillis(); Log.i("NetWork check Time", (t2 - t) + ""); } return false; } }
не нужно быть сложным. Самый простой и рамочный способ-использовать
ACCESS_NETWORK_STATEразрешение и просто сделать подключенный методpublic boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnectedOrConnecting(); }вы также можете использовать
requestRouteToHostЕсли у вас есть particualr хост и тип подключения (wifi/mobile) в виду.вы должны:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />в вашем манифесте android.
для более подробной информации иди сюда
использовать этот метод:
public static boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnectedOrConnecting(); }это разрешение требуется:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
попробуйте следующий код:
public static boolean isNetworkAvailable(Context context) { boolean outcome = false; if (context != null) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] networkInfos = cm.getAllNetworkInfo(); for (NetworkInfo tempNetworkInfo : networkInfos) { /** * Can also check if the user is in roaming */ if (tempNetworkInfo.isConnected()) { outcome = true; break; } } } return outcome; }
в манифесте
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />в коде
public static boolean isOnline(Context ctx) { if (ctx == null) return false; ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnectedOrConnecting()) { return true; } return false; }
после оператора "return" вы не можете написать код(исключая блок try-finally). Переместите новые коды действий перед операторами "return".
public boolean checkInternetConnection(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { return false; } else { 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; }
используйте этот код для проверки подключения к интернету
ConnectivityManager connectivityManager = (ConnectivityManager) ctx .getSystemService(Context.CONNECTIVITY_SERVICE); if ((connectivityManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connectivityManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED) || (connectivityManager .getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && connectivityManager .getNetworkInfo(ConnectivityManager.TYPE_WIFI) .getState() == NetworkInfo.State.CONNECTED)) { return true; } else { return false; }
вот функция, которую я использую как часть моего
Utilsкласс:public static boolean isNetworkConnected(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); return (cm.getActiveNetworkInfo() != null) && cm.getActiveNetworkInfo().isConnectedOrConnecting(); }использовать его как:
Utils.isNetworkConnected(MainActivity.this);
1-создать новый файл java (щелкните правой кнопкой мыши пакет. новый > класс > имя файла
ConnectionDetector.java2-добавьте следующий код в файл
<pre>package <add you package name> example com.example.example; import android.content.Context; import android.net.ConnectivityManager; public class ConnectionDetector { private Context mContext; public ConnectionDetector(Context context){ this.mContext = context; } public boolean isConnectingToInternet(){ ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); if(cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected() == true) { return true; } return false; } }3-Откройте
MainActivity.java- активность, где вы хотите проверить соединение, и сделать следующееA-создание и определение функции.
<pre>ConnectionDetector mConnectionDetector;</pre>B-внутри "OnCreate" добавьте следующее
<pre>mConnectionDetector = new ConnectionDetector(getApplicationContext());</pre>C - для проверки соединения выполните следующие действия
<pre> if (mConnectionDetector.isConnectingToInternet() == false) { //no connection- do something } else { //there is connection }</pre>
У меня были проблемы с IsInternetAvailable ответ не тестирование для сотовых сетей, а только если Wi-Fi был подключен. Этот ответ работает как для wifi, так и для мобильных данных:
Это еще один вариант для обработки всех ситуация:
public void isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { } else { Toast.makeText(ctx, "Internet Connection Is Required", Toast.LENGTH_LONG).show(); } }
Проверьте сеть, доступную в android со скоростью передачи данных в интернете.
public boolean isConnectingToInternet(){ ConnectivityManager connectivity = (ConnectivityManager) Login_Page.this.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) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); urlc.setRequestProperty("User-Agent", "Test"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(500); //choose your own timeframe urlc.setReadTimeout(500); //choose your own timeframe urlc.connect(); int networkcode2 = urlc.getResponseCode(); return (urlc.getResponseCode() == 200); } catch (IOException e) { return (false); //connectivity exists, but no internet. } } } return false; }эта функция возвращает true или false. Необходимо получить разрешение пользователя
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Comments