Android vérification de disponibilité de téléchargement de données
iKelSilver
-
1 déc. 2018 à 15:36
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023
-
3 déc. 2018 à 15:22
Bonjour,
J'ai un problème avec : getSystemService(CONNECTIVITY_SERVICE). Ça ne donne pas exactement ce que je désire. Cela marche seulement pour savoir si la connexion internet est activée sur le téléphone. Alors que dès fois, cette connexion peut-être activée, mais ne pouvant pas télécharger de données. Donc dans ce cas, ça affiche le message par défaut des navigateur que je ne désire pas voir dans mon Webview.
Voici mon code :
Aidez-moi à trouver la meilleur solution pour faire cela.
Bref, je voulais vérifier voir si le téléphone peut télécharger des données, si oui, j'affiche le contenu du Webview, sinon, je retourne vers l'activité Bienvenu.class
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 3 déc. 2018 à 15:22
Salut,
Tu peux te baser sur la dispo du transport utilisé et récupérer l'adresse IP.
Techniquement si tu as une IP valide, tu devrais avoir du réseau donc pouvoir télécharger de la donnée (sauf dans le cas du wifi rien n'est garanti).
Exemple (ici, pour le gsm, je me base sur l'ipv4):
...
private static final String TAG = "TAG";
private static final Pattern IPV4_PATTERN = Pattern.compile("^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
private ConnectivityManager mConnectivityManager;
private WifiManager mWifiManager;
...
mWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
...
private static boolean isIPv4Address(final String ip) {
return IPV4_PATTERN.matcher(ip).matches();
}
public static String intToIp(int i) {
return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 24) & 0xFF);
}
...
private boolean isWifi() {
final Network network = mConnectivityManager.getActiveNetwork();
final NetworkCapabilities capabilities = mConnectivityManager.getNetworkCapabilities(network);
return capabilities != null
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
&& capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
}
public String getCurrentIpAddress() {
final String unknown = "unknown";
try {
// Skip if no connection
if (mConnectivityManager.getActiveNetworkInfo() == null) return unknown;
if (isWifi()) {
Log.d(TAG, "wifi mode");
if(mWifiManager == null) return unknown;
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
final String ip = intToIp(wifiInfo.getIpAddress());
Log.d(TAG, "wifi: " + ip);
if (isIPv4Address(ip)) {
return ip;
} else {
final int delim = ip.indexOf('%'); // drop ip6 port suffix
return delim < 0 ? ip : ip.substring(0, delim);
}
} else {
Log.d(TAG, "gsm mode");
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && Inet4Address.class.isInstance(inetAddress)) {
Log.d(TAG, "gsm: " + inetAddress.getHostAddress());
return inetAddress.getHostAddress();
}
}
}
}
} catch (final Exception ex) {
Log.e(TAG, "Exception: " + ex.getMessage(), ex);
}
return unknown;
}
...
Il faudra également que tu écoutes sur les broadcasters gsm+wifi pour savoir si il y a un changement d'état entre le moment ou tu effectues une lecture de l'ip/connectivité et celui ou tu affiches la WebView.
J'ai extrait le code d'une de mes applications et dedans j'utilise les permissions suivantes: