Android cihazında İnternet bağlantısı olup olmadığını algılama


138

Cihazımın İnternet bağlantısı olup olmadığını söylemem gerekiyor. Bunun gibi birçok cevap buldum:

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
         = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

( Android'de kullanılabilir bir İnternet bağlantısı olup olmadığını tespit edin .)

Ancak bu doğru değil, örneğin İnternet erişimi olmayan bir kablosuz ağa bağlıysam , bu yöntem geri dönecektir… Cihazın sadece bağlı olup olmadığını değil, İnternet bağlantısı olup olmadığını anlamanın bir yolu var mı bir şeye?


Hey [bu] [1] ile de gidebilirsin. Bu yardımcı olabilir! [1]: stackoverflow.com/questions/4238921/…
akshay


isNetworkConnectedFonksiyon bloğu tüm kaldırılacaktır kod içeren Build.VERSION.SDK_INT >= Build.VERSION_CODES.M. Konu ve nasıl düzeltileceği hakkında daha ayrıntılı bir tartışma burada bulunabilir stackoverflow.com/questions/53532406/…
Basti Vagabond

Yanıtlar:


182

Haklısın. Girdiğiniz kod yalnızca bir ağ bağlantısı olup olmadığını kontrol eder. Etkin bir İnternet bağlantısı olup olmadığını kontrol etmenin en iyi yolu, bilinen bir sunucuya http aracılığıyla bağlanmayı denemektir.

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

Elbette http://www.google.com, bağlanmak istediğiniz diğer herhangi bir sunucunun veya iyi çalışma süresine sahip olduğunu bildiğiniz bir sunucunun URL'sini değiştirebilirsiniz .

Aşağıdaki yorumda Tony Cho'nun da işaret ettiği gibi , ana kodda bu kodu çalıştırmadığınızdan emin olun, aksi takdirde bir NetworkOnMainThread istisnası alırsınız (Android 3.0 veya sonraki sürümlerde). Bunun yerine bir AsyncTask veya Runnable kullanın.

Google.com'u kullanmak istiyorsanız Jeshurun'un değişikliğine bakmalısınız. Gelen onun cevabını o benim kod değiştirilebilir ve biraz daha verimli hale. Bağlanırsanız

HttpURLConnection urlc = (HttpURLConnection) 
            (new URL("http://clients3.google.com/generate_204")
            .openConnection());

ve sonra 204 için yanıt kodunu kontrol edin

return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);

ilk önce tüm Google ana sayfasını getirmeniz gerekmez.


9
@varunbhardwaj sadece farklı bir web sitesi (örneğin , uygulamanızı Çin'de dağıtırken baidu.com ) alabilir ya da ilk site bağlantı olmadığından emin olmazsa ikinci bir siteyi deneyebilirsiniz.
THelper

2
Cevabınızı + 1'leyin ve uygulamamda kullanmayı biliyorum, ancak bazı web sitelerinde büyük bir köşe bağımlılığı var ve sorum hala cevapsız kalıyor. neyse büyük geçici çözüm thanx.
varun bhardwaj

2
@blackcrow Kullanıcıların ne kadar süre beklemek istediğinize bağlıdır. Şahsen 1000 ms alt sınır, yaklaşık 6000 ms ortalama ve 15000 ms uzunluğundadır. Ancak, kontrol arka planda çalışıyorsa ve kullanıcı beklemiyorsa çok daha uzun zaman aşımları kullanabilirsiniz.
THelper

1
@varunbhardwaj Web servislerinizden vurabileceğiniz bazı URI'lar olmalıdır. Uygulamamız başladığında istediğimiz ilk şey, sunucu tarafında çeşitli parametreleri değiştirmemizi sağlayan çeşitli yapılandırma bilgileri içeren bir önyükleme dosyasıdır. Böyle bir şey kullanılabilir.
Steve

11
Bu aynı zamanda bir arka plan iş parçacığı üzerinde olmalıdır (oysa ConnectivityManagerbunu gerektirmez). Aksi takdirde, Android 4.x + cihazlarında bir NetworkOnMainThreadistisna elde edersiniz .
Anthony Chuinard

90

Bağlı WiFi ağının İnternet erişimine sahip olup olmadığını kontrol etmek için Android'in zaten kullandığı bilinen bir kesmek kullanmak için THelper'ın cevabını biraz değiştirdim. Bu, tüm Google ana sayfasını kapmaktan çok daha etkilidir. Daha fazla bilgi için buraya ve buraya bakın .

public static boolean hasInternetAccess(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) 
                (new URL("http://clients3.google.com/generate_204")
                .openConnection());
            urlc.setRequestProperty("User-Agent", "Android");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
        } catch (IOException e) {
            Log.e(TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(TAG, "No network available!");
    }
    return false;
}

1
Merhaba, bu uygulamayı mevcut uygulamalarda kullanmak uygun mudur?
Slava Fomin II

Bu, mevcut uygulamamızda uygulamada verimli mi?
Mayıs 15:33

5
Yukarıdaki cevaptaki yöntemden çok daha verimli olacaktır. Google ana sayfasını yakalamak, özellikle de üzerinde bir doodle varsa, çok verimsizdir.
Jeshurun

1
Doğru yanıt olarak işaretlendiğinde, yanıt geliştirildiğinden, bununla birlikte güncelleştirilmelidir. Aferin adam, teşekkürler
Hugo

3
Sen kullanmak isteyebilirsiniz g.cn/generate_204 yerine clients3.google.com/generate_204 yanı Çin'de deney bağlantısı istiyorsanız
breez

18
public boolean isInternetWorking() {
    boolean success = false;
    try {
        URL url = new URL("https://google.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setConnectTimeout(10000);
        connection.connect();
        success = connection.getResponseCode() == 200;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return success;
}

internet gerçekten mevcutsa doğru dön

Bu iki izne sahip olduğunuzdan emin olun

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

http yeni android güvenlik nedeniyle çalışmıyorsa, şimdi düz metin iletişimine izin vermiyorlar. şimdilik sadece geçerek.

android: usesCleartextTraffic = "true"


Bu en iyi, en eksiksiz cevaptır: bir şey yapmanın en kısa yolu (bir ping tüm web sitesine erişmez), hangi bağlantıya sahip olduğunuzdan bağımsız olarak çalışır ve kazanılan işlemde çalışır, bu yüzden android sürümleriyle güzel oynar .
MacD

Ne demek istediniz ? İşte mevcut bir proje check
Bilal Shahid

ne demek bu çağrı UI engelleyecek ve bu çağrı iplik yapmak gerekiyor ??
Amit Hooda

2
Bu benim için işe yaramıyor ... java.net.InetAddress.lookupHostByName (InetAddress.java:431) at
Maryadi Poipo

@HyosokaPoipo bunu ana iş parçacığında çağırmamalısınız. Ayrı bir iş parçacığı veya AsyncTask kullanın.
Pramesh Bajracharya

14

Lollipop veya üstünü hedefliyorsanız, yeni NetworkCapability sınıfını kullanmak mümkündür, yani:

public static boolean hasInternetConnection(final Context context) {
    final ConnectivityManager connectivityManager = (ConnectivityManager)context.
            getSystemService(Context.CONNECTIVITY_SERVICE);

    final Network network = connectivityManager.getActiveNetwork();
    final NetworkCapabilities capabilities = connectivityManager
            .getNetworkCapabilities(network);

    return capabilities != null
            && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}

1
connectivityManager.getActiveNetwork();Lollipop değil Marshmallow olan API lvl23 gerektirir.
Saenic

Ayrıca yetenekleri kontrol etmeli miyiz?
Alex

Alex capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)benim için hile yapmış gibiydi!
rstojano

6

Tam bir HTTP bağlantısı yapmanız gerekmez. Bilinen bir ana bilgisayara bir TCP bağlantısı açmayı deneyebilirsiniz ve başarılı olursa internet bağlantınız vardır.

public boolean hostAvailable(String host, int port) {
  try (Socket socket = new Socket()) {
    socket.connect(new InetSocketAddress(host, port), 2000);
    return true;
  } catch (IOException e) {
    // Either we have a timeout or unreachable host or failed DNS lookup
    System.out.println(e);
    return false;
  }
}

Sonra kontrol et:

boolean online = hostAvailable("www.google.com", 80);

80 numaralı bağlantı noktası güvenli bir bağlantı noktası mıdır?
ralphgabb

Bir HTTP sunucusu barındırdığı sürece, Bağlantı Noktası 80'de bir TCP bağlantısını kabul etmelidir.
Xiv

Bu bir AsyncTask içinde mi kullanılmalı yoksa sadece MainActivity'nin onCreate yönteminde mi çağrılmalıdır?
AlexioVay

@ Ağ ile ilgili herhangi bir şeyi ana / ui iş parçacığında çalıştırmamalısınız. Yani evet, bu bir içinde kullanılmalıdırAsyncTask
winklerrr

6

Kabul edilen cevaplara dayanarak, bu sınıfı bir dinleyici ile inşa ettim, böylece ana iş parçacığında kullanabilirsiniz:

Birincisi : Arka planda internet bağlantısını kontrol eden InterntCheck sınıfı, sonuçla birlikte bir dinleyici yöntemi çağırır.

public class InternetCheck extends AsyncTask<Void, Void, Void> {


    private Activity activity;
    private InternetCheckListener listener;

    public InternetCheck(Activity x){

        activity= x;

    }

    @Override
    protected Void doInBackground(Void... params) {


        boolean b = hasInternetAccess();
        listener.onComplete(b);

        return null;
    }


    public void isInternetConnectionAvailable(InternetCheckListener x){
        listener=x;
        execute();
    }

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) activity.getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }
    private boolean hasInternetAccess() {
        if (isNetworkAvailable()) {
            try {
                HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection());
                urlc.setRequestProperty("User-Agent", "Android");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1500);
                urlc.connect();
                return (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            Log.d("TAG", "No network available!");
        }
        return false;
    }

    public interface InternetCheckListener{
        void onComplete(boolean connected);
    }

}

İkincisi : ana iş parçacığında sınıfın bir örneğini başlatın ve yanıt bekleyin (android için Firebase api ile çalıştıysanız, bu size tanıdık gelmelidir!).

new InternetCheck(activity).isInternetConnectionAvailable(new InternetCheck.InternetCheckListener() {

        @Override
        public void onComplete(boolean connected) {
           //proceed!
        }
    });

Şimdi onComplete yönteminde cihazın internete bağlı olup olmadığını göreceksiniz.


3

bunu dene

public class ConnectionDetector {
    private Context _context;

    public ConnectionDetector(Context context) {
        this._context = context;
    }

    public boolean isConnectingToInternet() {
        if (networkConnectivity()) {
            try {
                HttpURLConnection urlc = (HttpURLConnection) (new URL(
                        "http://www.google.com").openConnection());
                urlc.setRequestProperty("User-Agent", "Test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(3000);
                urlc.setReadTimeout(4000);
                urlc.connect();
                // networkcode2 = urlc.getResponseCode();
                return (urlc.getResponseCode() == 200);
            } catch (IOException e) {
                return (false);
            }
        } else
            return false;

    }

    private boolean networkConnectivity() {
        ConnectivityManager cm = (ConnectivityManager) _context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            return true;
        }
        return false;
    }
}

manifest dosyanıza aşağıdaki izni eklemeniz gerekir:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

O zaman şöyle arayın:

if((new ConnectionDetector(MyService.this)).isConnectingToInternet()){
    Log.d("internet status","Internet Access");
}else{
    Log.d("internet status","no Internet Access");
}

bu
yazıyı

Bu gay kullanır deneyin yakalamak bu nedenle hata gösterilmez lütfen önce internet izni ekleyin sonra deneyin. iyi çalışıyor
Attaullah

Aktivitemde bu yöntemi nasıl aradığımı söyleyeyim mi?
Milan Gajera



1

Bunu ConnectivityManagerandroid için API kullanarak yapabilirsiniz . İnternete bağlı olup olmadığınızı ve bağlı olduğunuz internet bağlantısı türünü kontrol etmenizi sağlar. Temel olarak, Ölçülen veya Ölçülmeyen.

İnternet bağlantısını kontrol etmek için.

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();

Dokümantasyon bağlantısı: https://developer.android.com/training/monitoring-device-state/connectivity-status-type


Mobil verilerin tükenip tükenmediğini nasıl kontrol edersiniz? Bu, mobil veriler bağlı olsa ve hesapta veri bakiyesi kalmasa bile doğrudur.
user2672052

0
private static NetworkUtil mInstance;
private volatile boolean mIsOnline;

private NetworkUtil() {
    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            boolean reachable = false;
            try {
                Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
                int returnVal = process.waitFor();
                reachable = (returnVal==0);
            } catch (Exception e) {
                e.printStackTrace();
            }
            mIsOnline = reachable;
        }
    }, 0, 5, TimeUnit.SECONDS);
}

public static NetworkUtil getInstance() {
    if (mInstance == null) {
        synchronized (NetworkUtil.class) {
            if (mInstance == null) {
                mInstance = new NetworkUtil();
            }
        }
    }
    return mInstance;
}

public boolean isOnline() {
    return mIsOnline;
}

Yukarıdaki kod size yardımcı umuyoruz, ayrıca ur app internet izni olduğundan emin olun.


0

Belgelerden bunu yapmanın en son yolu ConnectivityManager, etkin ağı sorgulamak ve Internet bağlantısı olup olmadığını belirlemek için kullanmaktır .

public boolean hasInternetConnectivity() {
    ConnectivityManager cm =
        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return (activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting());
}

Bu iki izni AndroidManifest.xml dosyanıza ekleyin:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

1
Çalışmıyor :( @Buda Gavril'in dediği gibi, İnternet erişimi olmayan bir kablosuz ağa bağlıysam, bu yöntem yine de gerçek olacak. Xiaomi 4, Android 6.0.1 üzerinde test edin.
DysaniazzZ

0

Bağlantı yöneticisinde wifi türünü kontrol edin:

   //check network connection
    ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean hasNetworkConnection = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    System.out.println("Connection ? : " + hasNetworkConnection);
    //check wifi
    boolean hasWifiConnection = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    System.out.println("Wifi ? : " + hasWifiConnection);

Android Belgeleri 'TYPE_WIFI' ifadesini 'WIFI veri bağlantısı olarak tanımlar. Cihazlar birden fazla desteği destekleyebilir. '


0

Aktif ağın internet bağlantısı olup olmadığını kontrol etmek için güzel bir çözüm:

public boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager
            = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null) {
        Network network = connectivityManager.getActiveNetwork();
        NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
        return networkCapabilities != null && networkCapabilities
                .hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
    }
    return false;
}

0

ConnectivityManager'ı kullanabilirsiniz.

val cm = getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
            val dialogBuilder = AlertDialog.Builder(this)

            if (activeNetwork!=null) // Some network is available
            {
                if (activeNetwork.isConnected) { // Network is connected to internet

    }else{ // Network is NOT connected to internet

    }

Kontrol bu ve bu


0

Son API düzeyine güncellenmiş aşağıdaki sınıfı kullanın : 29.

// License: MIT
// http://opensource.org/licenses/MIT
package net.i2p.android.router.util;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Build;
import android.telephony.TelephonyManager;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.concurrent.CancellationException;



/**
 * Check device's network connectivity and speed.
 *
 * @author emil http://stackoverflow.com/users/220710/emil
 * @author str4d
 * @author rodrigo https://stackoverflow.com/users/5520417/rodrigo
 */
public class ConnectivityAndInternetAccessCheck {

    private static ArrayList < String > hosts = new ArrayList < String > () {
        {
            add("google.com");
            add("facebook.com");
            add("apple.com");
            add("amazon.com");
            add("twitter.com");
            add("linkedin.com");
            add("microsoft.com");
        }
    };
    /**
     * Get the network info.
     *
     * @param context the Context.
     * @return the active NetworkInfo.
     */
    private static NetworkInfo getNetworkInfo(Context context) {
        NetworkInfo networkInfo = null;
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm != null) {
            networkInfo = cm.getActiveNetworkInfo();
        }
        return networkInfo;
    }

    /**
     * Gets the info of all networks
     * @param context The context
     * @return an array of @code{{@link NetworkInfo}}
     */
    private static NetworkInfo[] getAllNetworkInfo(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getAllNetworkInfo();
    }

    /**
     * Gives the connectivity manager
     * @param context The context
     * @return the @code{{@link ConnectivityManager}}
     */
    private static ConnectivityManager getConnectivityManager(Context context) {
        return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    }

    /**
     * Check if there is any connectivity at all.
     *
     * @param context the Context.
     * @return true if we are connected to a network, false otherwise.
     */
    public static boolean isConnected(Context context) {
        boolean isConnected = false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ConnectivityManager connectivityManager = ConnectivityAndInternetAccessCheck.getConnectivityManager(context);
            Network[] networks = connectivityManager.getAllNetworks();
            networksloop: for (Network network: networks) {
                if (network == null) {
                    isConnected = false;
                } else {
                    NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
                    if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)){
                        isConnected = true;
                        break networksloop;
                    }
                    else {
                        isConnected = false;
                    }
                }
            }

        } else {
            NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context);
            networkinfosloop: for (NetworkInfo info: networkInfos) {
                // Works on emulator and devices.
                // Note the use of isAvailable() - without this, isConnected() can
                // return true when Wifi is disabled.
                // http://stackoverflow.com/a/2937915
                isConnected = info != null && info.isAvailable() && info.isConnected();
                if (isConnected) {
                    break networkinfosloop;
                }
            }

        }
        return isConnected;
    }

    /**
     * Check if there is any connectivity to a Wifi network.
     *
     * @param context the Context.
     * @return true if we are connected to a Wifi network, false otherwise.
     */
    public static boolean isConnectedWifi(Context context) {
        boolean isConnectedWifi = false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ConnectivityManager connectivityManager = ConnectivityAndInternetAccessCheck.getConnectivityManager(context);
            Network[] networks = connectivityManager.getAllNetworks();
            networksloop: for (Network network: networks) {
                if (network == null) {
                    isConnectedWifi = false;
                } else {
                    NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
                    if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)){
                        if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                            isConnectedWifi = true;
                            break networksloop;
                        } else {
                            isConnectedWifi = false;
                        }
                    }
                }

            }


        } else {
            NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context);
            networkinfosloop: for (NetworkInfo n: networkInfos) {
                isConnectedWifi = n != null && n.isAvailable() && n.isConnected() && n.getType() == ConnectivityManager.TYPE_WIFI;
                if (isConnectedWifi) {
                    break networkinfosloop;
                }

            }
        }
        return isConnectedWifi;
    }

    /**
     * Check if there is any connectivity to a mobile network.
     *
     * @param context the Context.
     * @return true if we are connected to a mobile network, false otherwise.
     */
    public static boolean isConnectedMobile(Context context) {
        boolean isConnectedMobile = false;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ConnectivityManager connectivityManager = ConnectivityAndInternetAccessCheck.getConnectivityManager(context);
            Network[] allNetworks = connectivityManager.getAllNetworks();
            networksloop: for (Network network: allNetworks) {
                if (network == null) {
                    isConnectedMobile = false;
                } else {
                    NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
                    if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)){
                        if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                            isConnectedMobile = true;
                            break networksloop;
                        } else {
                            isConnectedMobile = false;
                        }
                    }
                }

            }

        } else {
            NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context);
            networkinfosloop: for (NetworkInfo networkInfo: networkInfos) {
                isConnectedMobile = networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
                if (isConnectedMobile) {
                    break networkinfosloop;
                }
            }
        }
        return isConnectedMobile;
    }

    /**
     * Check if there is fast connectivity.
     *
     * @param context the Context.
     * @return true if we have "fast" connectivity, false otherwise.
     */
    public static boolean isConnectedFast(Context context) {
        boolean isConnectedFast = false;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context);
            networkInfosloop:
            for (NetworkInfo networkInfo: networkInfos) {
                isConnectedFast = networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected() && isConnectionFast(networkInfo.getType(), networkInfo.getSubtype());
                if (isConnectedFast) {
                    break networkInfosloop;
                }
            }
        } else {
            throw new UnsupportedOperationException();
        }
        return isConnectedFast;
    }

    /**
     * Check if the connection is fast.
     *
     * @param type the network type.
     * @param subType the network subtype.
     * @return true if the provided type/subtype combination is classified as fast.
     */
    private 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;
        }
    }

    public ArrayList < String > getHosts() {
        return hosts;
    }

    public void setHosts(ArrayList < String > hosts) {
        this.hosts = hosts;
    }
    //TODO Debug on devices
    /**
     * Checks that Internet is available by pinging DNS servers.
     */
    private static class InternetConnectionCheckAsync extends AsyncTask < Void, Void, Boolean > {

        private Context context;

        /**
         * Creates an instance of this class
         * @param context The context
         */
        public InternetConnectionCheckAsync(Context context) {
            this.setContext(context);
        }

        /**
         * Cancels the activity if the device is not connected to a network.
         */
        @Override
        protected void onPreExecute() {
            if (!ConnectivityAndInternetAccessCheck.isConnected(getContext())) {
                cancel(true);
            }
        }

        /**
         * Tells whether there is Internet access
         * @param voids The list of arguments
         * @return True if Internet can be accessed
         */
        @Override
        protected Boolean doInBackground(Void...voids) {
            return isConnectedToInternet(getContext());
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
        }

        /**
         * The context
         */
        public Context getContext() {
            return context;
        }

        public void setContext(Context context) {
            this.context = context;
        }
    } //network calls shouldn't be called from main thread otherwise it will throw //NetworkOnMainThreadException

    /**
     * Tells whether Internet is reachable
     * @return true if Internet is reachable, false otherwise
     * @param context The context
     */
    public static boolean isInternetReachable(Context context) {
        try {
            return new InternetConnectionCheckAsync(context).execute().get();
        } catch (CancellationException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * Tells whether there is Internet connection
     * @param context The context
     * @return @code {true} if there is Internet connection
     */
    private static boolean isConnectedToInternet(Context context) {
        boolean isAvailable = false;
        if (!ConnectivityAndInternetAccessCheck.isConnected(context)) {
            isAvailable = false;
        } else {
            try {
                foreachloop: for (String h: new ConnectivityAndInternetAccessCheck().getHosts()) {
                    if (isHostAvailable(h)) {
                        isAvailable = true;
                        break foreachloop;
                    }
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

        return isAvailable;

    }

    /**
     * Checks if the host is available
     * @param hostName
     * @return
     * @throws IOException
     */
    private static boolean isHostAvailable(String hostName) throws IOException {
        try (Socket socket = new Socket()) {
            int port = 80;
            InetSocketAddress socketAddress = new InetSocketAddress(hostName, port);
            socket.connect(socketAddress, 3000);

            return true;
        } catch (UnknownHostException unknownHost) {
            return false;
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.