2015-01-21 7 views
14

Moja aplikacja działa doskonale w sieciach Wi-Fi i telefonii komórkowej, ale nie wykrywa, gdy jest połączona przez tethering bluetooth.Doskonała funkcja do sprawdzania połączenia internetowego z Androidem, w tym panela bluetooth.

public boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) 
     getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 

    if (networkInfo != null && networkInfo.isConnected()) { 
     return true; 
    } 
    return false; 
} 

Próbowałem uruchomić kilka innych aplikacji. nie wyświetlają się też żadne połączenia sieciowe, ale aplikacje google działają idealnie, a także niektóre inne aplikacje, takie jak whatsap. Zastanawiasz się, jak to robią i dlaczego większość aplikacji brakuje tego punktu.

Czy ktoś może mi powiedzieć, w jaki sposób sprawdzić połączenie internetowe w Androidzie, za pośrednictwem wszelkich dostępnych środków, w tym pan bluetooth i proxy, itp.

Każda pomoc zostanie doceniona. Z góry dzięki ..

+0

check to http://stackoverflow.com/a/22668259/2811956 –

+0

to wykryć stan udostępniania połączenia Bluetooth, nie do sprawdzenia łączności sieciowej przez niego – JIthin

+0

prostu spróbuj pingować stronę internetową, takich jak Google, bez względu na skąd pochodzi połączenie. – Pedram

Odpowiedz

1

zgadzam się z muzikant i dzięki za pomysł. Pomyślałem, że lepiej będzie opublikować zaimplementowane rozwiązanie, ponieważ potrzebuje kilku dodatków.

Tak to rozwiązałem.

Utworzone i AsyncTask, aby uniknąć sieci w wyjątku głównym wątku.

public class GetInternetStatus extends AsyncTask<Void,Void,Boolean> { 

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

    return hasInternetAccess(); 
} 

protected boolean hasInternetAccess() 
{ 

    try 
    { 
     URL url = new URL("http://www.google.com"); 

     HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
     urlc.setRequestProperty("User-Agent", "Android Application:1"); 
     urlc.setRequestProperty("Connection", "close"); 
     urlc.setConnectTimeout(1000 * 30); 
     urlc.connect(); 

     // http://www.w3.org/Protocols/HTTP/HTRESP.html 
     if (urlc.getResponseCode() == 200 || urlc.getResponseCode() > 400) 
     { 
      // Requested site is available 
      return true; 
     } 
    } 
    catch (Exception ex) 
    { 
     // Error while trying to connect 
     ex.printStackTrace(); 
     return false; 
    } 
    return false; 
} 

}

Teraz dodać następującą funkcję do aktywności i nazywają to sprawdzić łączność.

// Checking for all possible internet connections 
    public static boolean isConnectingToInternet() { 
     Boolean result = false; 
     try { 
      //get the result after executing AsyncTask 
      result = new GetInternetStatus().execute().get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 
3

Najprostszym sposobem na sprawdzenie, czy telefon (lub inne urządzenie) ma połączenie z Internetem, jest wysyłanie pingów do serwera internetowego w moich oczach. Oczywiście potrzebujesz adresu IP, który zawsze jest osiągalny. Możesz spróbować tego kodu (z głowy) może trzeba złapać kilka wyjątków:

public boolean hasInternetConection() { 
    Runtime runtime = Runtime.getRuntime(); 
    Process ping = runtime.exec("/system/bin/ping -c 1 173.194.39.4"); // google.com 

    int result = ping.waitFor(); 

    if(result == 0) return true; 
    else return false; 
} 

Oczywiście trzeba uruchomić tę metodę za każdym razem, gdy stan wifi, stan bluetooth lub coś jeszcze zmienić (Polecam w osobnym wątku), ale w sumie powinien działać na twój problem.

+0

Miły i najmniejszy sposób myślę. Próbowałem polecenia w powłoce adb, ale nie udało się. Spróbuję użyć kodu. Mam nadzieję, że działa na wszystkich urządzeniach bez rootowania. – JIthin

+0

Powinien działać na każdym telefonie bez korzenia. Daj mi znać, jeśli ci to pomogło :) – Cilenco

+0

Czy warto zużyć dane i czas oczekiwania, aby ping powrócił? Czy nie byłoby łatwiej po prostu sprawdzić stan łączności telefonicznej? –

7

Spróbuj połączyć się z witryną "zawsze dostępna". jeśli jakiś związek istnieje, to powinien wrócić prawdziwe:

protected static boolean hasInternetAccess() 
{ 
    try 
    { 
     URL url = new URL("http://www.google.com"); 

     HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
     urlc.setRequestProperty("User-Agent", "Android Application:1"); 
     urlc.setRequestProperty("Connection", "close"); 
     urlc.setConnectTimeout(1000 * 30); 
     urlc.connect(); 

     // http://www.w3.org/Protocols/HTTP/HTRESP.html 
     if (urlc.getResponseCode() == 200 || urlc.getResponseCode() > 400) 
     { 
      // Requested site is available 
      return true; 
     } 
    } 
    catch (Exception ex) 
    { 
     // Error while trying to connect 
     return false; 
    } 
    return false; 
} 
+0

whoopz ,, nyc idea man. ;) –

+0

fajny pomysł i to najprostszy. Jest to praktyczne. Ale starałem się znaleźć połączenie z Internetem, a także, aby zidentyfikować tryb połączenia, choć może nie być konieczne, zawsze. – JIthin

+1

Czy warto zużyć dane i czas oczekiwania, aby ping powrócił? Czy nie byłoby łatwiej po prostu sprawdzić stan łączności telefonicznej? –

4

może być to pomocne, getAllNetworkInfo() dostarczyć wykaz informacji sieciowej

public boolean checkNetworkStatus(Context context) 
      { 
       boolean flag = false; 
       ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
       NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 

       //it provide all type of connectivity ifo 
       for (NetworkInfo ni : netInfo) 
       { 
        if (ni.getTypeName().equalsIgnoreCase("Connecxtion Type")) 
         if (ni.isConnected()) 
          flag = true; 
       } 
       return flag; 
      } 
+0

Wypróbowałem to samo wcześniej, ale nie udało się zidentyfikować sieci pan bluetooth. – JIthin

3

można użyć następujących:

public boolean isMyNetworkIsLive() { 
    boolean isConnectionActive = false; 
    ConnectivityManager mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo nNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); 
    if (nNetworkInfo != null && nNetworkInfo.isConnectedOrConnecting()) { 
     isConnectionActive = true; 
    } 
    return isConnectionActive; 
} 

Ref od Test Internet Connection Android

3

Wygląda na to, że sprawdzisz łączność z Internetem w porządku. O Bluetooth, spróbuj tego:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { 
    // Bluetooth enabled 
} 

Twój idealny funkcja byłoby coś jak:

public boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

    return networkInfo != null && networkInfo.isConnected() 
      bluetoothAdapter != null && bluetoothAdapter.isEnabled() 
} 

myślę, trzeba będzie te uprawnienia:

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

Do łączności Bluetooth - Sprawdza tylko, czy funkcja Bluetooth jest włączona, ale nie, jeśli aktywne jest tethering przez Bluetooth. We wszystkich przypadkach (Bluetooth, Wi-Fi, sieć Wi-Fi) nie daje to odpowiedzi na pytanie "Czy mam połączenie z Internetem?" ponieważ możesz być podłączony do sieci Wi-Fi, która nie ma połączenia z Internetem (zamknięta/prywatna sieć, sieć wymagająca zalogowania itp.) – Muzikant

+0

Nie ukończono ... – Gattsu

Powiązane problemy