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

iKelSilver - 1 déc. 2018 à 15:36
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 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 :
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.

1 réponse

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
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:
...
  <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.
0
Rejoignez-nous