Каков правильный способ проверки доступности мобильной сети (без подключения к данным)
Каков правильный способ проверки доступности мобильной сети (GSM) на Android? ( > 2.1) Я не хочу проверять, есть ли доступ к данным через мобильную сеть, просто проверьте наличие сети в целом. (проверьте, разрешены ли телефонные звонки по мобильной сети)
В настоящий момент я использую следующую проверку:
public static boolean checkMobileNetworkAvailable(Context context){
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = tm.getNetworkType();
return (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN);
}
Но кажется, что некоторые устройства всегда отчитываются "NETWORK_TYPE_UNKNOWN". Таким образом, проверка не работает все время.
Есть ли лучший способ сделать это?
Обновление:
Будет ли улучшен следующий подход?
public static boolean checkMobileNetworkAvailable(Context context){
boolean isMobileNetworkAvailable = false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] networks = cm.getAllNetworkInfo();
for(int i=0;i<networks.length;i++){
if(networks[i].getType() == ConnectivityManager.TYPE_MOBILE){
if(networks[i].isAvailable()){
isMobileNetworkAvailable = true;
}
}
}
return isMobileNetworkAvailable;
}
Ответы
Ответ 1
Я использовал следующий код, чтобы узнать, подключен ли я к сети (нет мобильных данных):
public static Boolean isMobileAvailable(Context appcontext) {
TelephonyManager tel = (TelephonyManager) appcontext.getSystemService(Context.TELEPHONY_SERVICE);
return ((tel.getNetworkOperator() != null && tel.getNetworkOperator().equals("")) ? false : true);
}
NetworkOperator возвращается только в том случае, если телефон фактически зарегистрирован в сети.
Ответ 2
Для меня отлично работает PhoneStateListener:
private static class YourListener extends PhoneStateListener {
@Override
public void onServiceStateChanged(ServiceState serviceState){
if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {
// connected to cellular network
}
}
}
И зарегистрируйтесь в TelephonyManager:
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
YourListener listener = new YourListener();
tm.listen(listener, PhoneStateListener.LISTEN_SERVICE_STATE);
При регистрации диспетчер телефонии вызывает метод onServiceChanged() для объекта-слушателя и передает текущее состояние.
PS: PhoneStateListener использует обработчик для вывода результата в поток пользовательского интерфейса, поэтому вы должны создать его в потоке пользовательского интерфейса.
Ответ 3
Я использую следующий метод проверки доступности сетевого подключения в android. Лучше всего вы можете скопировать этот метод так, как есть, и можете использовать его для проверки сетевого подключения. Он проверяет подключение всех сетей, чтобы убедиться, что какая-либо сеть подключена или нет.
/**
* Check the hardware if there are connected to Internet or not.
* This method gets the list of all available networks and if any one of
* them is connected returns true. If none is connected returns false.
*
* @param context {@link Context} of the app.
* @return <code>true</code> if connected or <code>false</code> if not
*/
public static boolean isNetworkAvailable(Context context) {
boolean available = false;
try {
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) {
available = true;
}
}
}
}
if (available == false) {
NetworkInfo wiMax = connectivity.getNetworkInfo(6);
if (wiMax != null && wiMax.isConnected()) {
available = true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return available;
}
Ответ 4
Посмотрите мой ответ на Проблема в обнаружении подключения к Интернету в Android.
Вы можете получить ответ NETWORK_TYPE_UNKNOWN
, если сеть либо недоступна, либо все еще подключена.
Ответ 5
Я считаю, что это сработает.
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
networkAvailable = true;
}
Ответ 6
Долгое время я искал эффективное решение, чтобы узнать, есть ли у устройств доступ к мобильной сети (не к сети передачи данных).
Ответ Виктора - очень эффективное решение: fooobar.com/info/368789/...
Если вам нужно только состояние службы в определенный момент, вы можете отменить регистрацию слушателя в обратном вызове onServiceStateChanged. Как это:
private inner class PhoneListener : PhoneStateListener(){
override fun onServiceStateChanged(serviceState: ServiceState?) {
if (serviceState?.state != ServiceState.STATE_IN_SERVICE) {
//Behavior when no mobile network
}
//unregister listener after one callback call
//phoneListener is the PhoneListener you previously create to register listener
val tel = requireContext().getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
tel.listen(phoneListener, PhoneStateListener.LISTEN_NONE)
}
}