Como você detecta o tipo de conexão de rede no Android?
Terminou ConnectivityManager.getActiveNetworkInfo().getType()
e a resposta é limitada a Wi-Fi e dispositivos móveis?
fonte
Como você detecta o tipo de conexão de rede no Android?
Terminou ConnectivityManager.getActiveNetworkInfo().getType()
e a resposta é limitada a Wi-Fi e dispositivos móveis?
Se o problema for descobrir se a rede do telefone está conectada e rápida o suficiente para atender às suas demandas, você precisa lidar com todos os tipos de rede retornados getSubType()
.
Levei uma hora ou duas para pesquisar e escrever esta classe para fazer exatamente isso, e pensei em compartilhá-la com outras pessoas que possam achar útil.
Aqui está um Gist da classe , para que você possa bifurcá-lo e editá-lo.
package com.emil.android.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
/**
* Check device's network connectivity and speed
* @author emil http://stackoverflow.com/users/220710/emil
*
*/
public class Connectivity {
/**
* Get the network info
* @param context
* @return
*/
public static NetworkInfo getNetworkInfo(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* Check if there is any connectivity
* @param context
* @return
*/
public static boolean isConnected(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected());
}
/**
* Check if there is any connectivity to a Wifi network
* @param context
* @return
*/
public static boolean isConnectedWifi(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
/**
* Check if there is any connectivity to a mobile network
* @param context
* @return
*/
public static boolean isConnectedMobile(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
/**
* Check if there is fast connectivity
* @param context
* @return
*/
public static boolean isConnectedFast(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype()));
}
/**
* Check if the connection is fast
* @param type
* @param subType
* @return
*/
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:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_CDMA:
return false; // ~ 14-64 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return true; // ~ 400-1000 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return true; // ~ 600-1400 kbps
case TelephonyManager.NETWORK_TYPE_GPRS:
return false; // ~ 100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
return true; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_HSPA:
return true; // ~ 700-1700 kbps
case TelephonyManager.NETWORK_TYPE_HSUPA:
return true; // ~ 1-23 Mbps
case TelephonyManager.NETWORK_TYPE_UMTS:
return true; // ~ 400-7000 kbps
/*
* Above API level 7, make sure to set android:targetSdkVersion
* to appropriate level to use these
*/
case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11
return true; // ~ 1-2 Mbps
case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
return true; // ~ 5 Mbps
case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
return true; // ~ 10-20 Mbps
case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
return false; // ~25 kbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return false;
}
}else{
return false;
}
}
}
Certifique-se também de adicionar essa permissão ao AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
As fontes para velocidades de rede incluem a wikipedia e http://3gstore.com/page/78_what_is_evdo_mobile_broadband.html
public static final int
. Então você não precisa fazer o "hack". Apenas direcionado para o SDK mais novo, o compilador compila os valores reais (números inteiros) para os quais eles apontam (não suas instâncias) em bytecodes.targetSdkVersion
configuração. Eu editei o post para remover o hack, obrigado.Para obter informações mais precisas (e fáceis de usar) sobre o tipo de conexão. Você pode usar esse código (derivado de um método @hide em TelephonyManager.java ).
Este método retorna uma String descrevendo o tipo de conexão atual.
ou seja, um dos seguintes: "WIFI", "2G", "3G", "4G", "5G", "-" (não conectado) ou "?" (desconhecido)
Observação: esse código requer a API 25 ou superior, mas você pode facilmente suportar versões mais antigas usando int em vez de const. (Veja os comentários no código).
fonte
Você pode usar getSubtype () para mais detalhes. Confira o slide 9 aqui: http://dl.google.com/io/2009/pres/W_0300_CodingforLife-BatteryLifeThatIs.pdf
Além disso, confira a resposta de Emil para um mergulho mais detalhado sobre isso.
fonte
@ A resposta de Emil acima é brilhante.
Pequena adição: idealmente, devemos usar o TelephonyManager para detectar tipos de rede. Portanto, o acima deve ler:
fonte
A resposta de Emil Davtyan é boa, mas foram adicionados tipos de rede que não são contabilizados em sua resposta. Portanto,
isConnectionFast(int type, int subType)
pode retornar false quando deve ser verdadeiro.Aqui está uma classe modificada que usa reflexão para considerar os tipos de rede adicionados nas APIs posteriores:
fonte
if (NetworkUtils.isWifiConnection(this) { /* do stuff */ }
Você pode criar um método personalizado para realizar esta tarefa.
fonte
Além da impressionante resposta de Emil, gostaria de adicionar mais um método, para verificar se você realmente tem acesso à Internet, pois pode ter os dados desativados no telefone.
Observe que isso é apenas para verificar se há uma conexão de dados de celular e retornará falso se você tiver o Wi-Fi conectado, pois os dados do celular estão desativados quando o Wi-Fi está conectado.
fonte
Você pode verificar assim
fonte
você deve obter o nome da rede
fonte
Atualmente, apenas MOBILE e WIFI são suportados. Dê uma olhada e função de tipo legível por humanos .
fonte
Você pode tentar isso:
fonte
Detectar o tipo de rede e obter o valor booleano de isconnected ou não usar abaixo do snippet
use isto após a classe passar o contexto, você obterá o status da rede como tipo de rede, rede rápida, etc.
fonte
Mostrado abaixo diferentes maneiras de fazer isso. Observe que existem muitos tipos de rede na classe ConnectivityManager. Além disso, se API> = 21, você pode verificar os tipos de rede na classe NetworkCapabilities.
fonte