Страницы

Поиск по вопросам

вторник, 31 марта 2020 г.

Проверка подключения к интернету при старте приложения Android

#java #android #android_studio


В общем есть приложение, имеет 3 активити: 


Loading Page (splash screen);
WebView для конкретного сайта;
Активити с картинкой об отсутствии интернета.


Вопрос: как во время работы 1 активити проверить подключение к интернету и, в случае
если его нет, кинуть на 3 активити, а если есть, то на 2?
    


Ответы

Ответ 1



Обычно советуют решения на базе ConnectivityManager, но оно показывает лишь факт подключения к какой-либо сети, что не говорит о том, что есть связь с интернетом. Если вы подключитесь к локальной сети по Wi-fi, то метод вернёт true, но доступа к интернету может и не быть, т.к. это локальная сеть. Я бы рекомендовал пинговать адрес, чтоб наверняка сказать, есть ли инет: 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; } Можно прям из UI потока. Или подключиться попробовать: public boolean isOnline() { try { int timeoutMs = 1500; Socket sock = new Socket(); SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53); sock.connect(sockaddr, timeoutMs); sock.close(); return true; } catch (IOException e) { return false; } } Нужен пермишен: Но это не будет работать в UI потоке, нужно завернуть, к примеру, в AsyncTask: class InternetCheck extends AsyncTask { 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); } } Использовать так: new InternetCheck(internet -> { /* делаем здесь что-то после получения результата */ }); Источник

Ответ 2



if(isConnected()){ Intent intent = new Intent(this, ActivityTwo.class); startActivity(intent); }else{ Intent intent = new Intent(this, ActivityThree.class); startActivity(intent); } public boolean isConnected() { boolean connected = false; try { ConnectivityManager cm = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo nInfo = cm.getActiveNetworkInfo(); connected = nInfo != null && nInfo.isAvailable() && nInfo.isConnected(); return connected; } catch (Exception e) { Log.e("Connectivity Exception", e.getMessage()); } return connected; }

Комментариев нет:

Отправить комментарий