Android vérification de disponibilité de téléchargement de données

- - Dernière réponse : Twinuts
Messages postés
5307
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
- 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 :
ConnectivityManager cm=(ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
                if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnectedOrConnecting()) {

                    WebView myWebView = (WebView) findViewById(R.id.afficher_mes_photos);
                    myWebView.getSettings().setJavaScriptEnabled(true);
                    myWebView.loadUrl(lien_boutique);
                    myWebView.setWebViewClient(new WebViewClient());

                }
                else {

                    Intent intent_etat_connexion_internet = new Intent(MesPhotos.this, Bienvenu.class);
                    startActivity(intent_etat_connexion_internet);

                }

<WebView
        android:id="@+id/afficher_mes_photos"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimaryDark"
        android:backgroundTint="@color/colorPrimaryDark"
        android:clickable="true">
    </WebView>


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

Merci d'avance.
Afficher la suite 

Votre réponse

1 réponse

Messages postés
5307
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
0
Merci
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:
...
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.ACTION_BACKGROUND_DATA_SETTING_CHANGED" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.WIFI_STATE_CHANGED" />
  <uses-permission android:name="android.permission.INTERNET" />
...



Une autre solution plus contraignante sera de faire une connexion bidon avant d'afficher ta WebView.
Commenter la réponse de Twinuts

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.