#java #android #shell
Вычитал, что можно проверять интернет соединение с помощью android.permission.ACCESS_NETWORK_STATE Или android.net.ConnectivityManager Но все это только с помощью java. Можно ли реализовать это с помощью Shell?
Ответы
Ответ 1
Можно проверить таким образом public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnectedOrConnecting(); } Но, в этом способе проверки есть один большой минус. Проверяется только подключение к сети(wifi,3g,4g и т.д.) Если вы будите подключены к WIFI, а интернета не будет, то сервис покажет, что соединение есть. Хотя, по факту его нету. По поводу PING - исполняемый файл добавляют не все производители. Встречал часто китайские устройства, где нету файла 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; } Как показывает практика, лучше всего делать запрос на какой-то сайт, например Google.com и отслеживать ответ на предмет UnknownHostException 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; } } И не забывайте, что все операции с сетью нужно делать в отдельном потоке И нужно добавить 2 пермишена в ManifestsОтвет 2
Возможно покажется костылём, но я считаю, что это самый надёжный способ: отправить запрос на какой-нибудь сайт, который может возвращать какие-то данные (например в формате JSON) и если ответ с сервера приходит, то интернет есть, если выскакивает ошибка, то его нет. Это очень просто реализовать если будешь использовать библиотеку Retrofit 2Ответ 3
У себя проверяю вот так: правда минус один , как уже писали, проверяет есть ли соединение только на момент срабатывания метода. /* * тут проверяю есть ли сеть * if NetworkChecker.isNetworkAvailable(getActivity())) { * сеть доступна } */ public class NetworkChecker { /** old version to {@link #isNetworkAvailable} */ public static boolean isConnected(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = null; if (cm != null) { activeNetwork = cm.getActiveNetworkInfo(); } return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } /** * Get the network info * * */ public static NetworkInfo getNetworkInfo(Context context){ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo(); } /** * Check if there is any connectivity * * */ public static boolean isNetworkAvailable(Context context){ NetworkInfo info = NetworkChecker.getNetworkInfo(context); return (info != null && info.isConnected()); } /** * Check if there is any connectivity to a Wifi network * */ public static boolean isConnectedWifi(Context context){ NetworkInfo info = NetworkChecker.getNetworkInfo(context); return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); } /** * Check if there is any connectivity to a mobile network * */ public static boolean isConnectedMobile(Context context){ NetworkInfo info = NetworkChecker.getNetworkInfo(context); return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE); } /** * Check if there is fast connectivity * */ public static boolean isConnectedFast(Context context){ NetworkInfo info = NetworkChecker.getNetworkInfo(context); return (info != null && info.isConnected() && NetworkChecker.isConnectionFast(info.getType(),info.getSubtype())); } /** * Check if the connection is fast * */ public static boolean isConnectionFast(int type, int subType){ if(type==ConnectivityManager.TYPE_WIFI){ return true; }else if(type==ConnectivityManager.TYPE_MOBILE){ switch(subType){ case TelephonyManager.NETWORK_TYPE_1xRTT: // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_CDMA: // ~ 14-64 kbps case TelephonyManager.NETWORK_TYPE_EDGE: // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_GPRS: // ~ 100 kbps return false; case TelephonyManager.NETWORK_TYPE_EVDO_0: // ~ 400-1000 kbps case TelephonyManager.NETWORK_TYPE_EVDO_A: // ~ 600-1400 kbps case TelephonyManager.NETWORK_TYPE_HSDPA: // ~ 2-14 Mbps case TelephonyManager.NETWORK_TYPE_HSPA: // ~ 700-1700 kbps case TelephonyManager.NETWORK_TYPE_HSUPA: // ~ 1-23 Mbps case TelephonyManager.NETWORK_TYPE_UMTS: // ~ 400-7000 kbps return true; /* * Above API level 7, make sure to set android:targetSdkVersion * to appropriate level to use these */ case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 // ~ 1-2 Mbps case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 // ~ 5 Mbps case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 // ~ 10-20 Mbps case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 // ~ 10+ Mbps return true; case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 // ~25 kbps return false; // Unknown case TelephonyManager.NETWORK_TYPE_UNKNOWN: default: return false; } }else{ return false; } } }
Комментариев нет:
Отправить комментарий