Идеальная функция для проверки возможности подключения к Интернету в Android, включая панель управления bluetooth

Мое приложение отлично работает в сетях Wi-Fi и мобильных сетях, но при подключении через Bluetooth-модем не обнаруживается.

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

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

Я попробовал запустить еще несколько приложений. они также не показывают подключения к сети, но приложения Google работают идеально и, как некоторые другие приложения, такие как whatsap. Интересно, как они это делают, и почему большинство приложений не хватает этой точки.

Может ли кто-нибудь сказать мне способ проверить подключение к Интернету в Android, используя все доступные средства, в том числе панорамирование и прокси-сервер bluetooth и т.д.

Любая помощь будет оценена. Спасибо заранее.

Ответ 1

Я согласен с Музикантом и благодарю за эту идею. Я подумал, что лучше будет опубликовать реализованное решение, так как ему нужны некоторые дополнения.

Вот как я это решил.

Создано и AsyncTask, чтобы избежать сети при исключении основного потока.

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;
}

}

Теперь добавьте следующую функцию в действие и вызовите ее, чтобы проверить подключение.

    // 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;
    }

Ответ 2

Попробуйте подключиться к веб-сайту "всегда доступно". если какое-либо соединение существует, это должно возвращать true:

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;
}

Ответ 3

может быть полезно, getAllNetworkInfo() предоставить список сетевой информации

 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;
            }

Ответ 4

Самый простой способ определить, имеет ли телефон (или любое другое устройство) соединение с Интернетом, - это отправить пинг на веб-сервер в моих глазах. Конечно, вам нужен адрес ip, который всегда доступен. Вы можете попробовать этот код (из моей головы), возможно, вам придется поймать некоторые исключения:

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;
}

Конечно, вы должны запускать этот метод каждый раз, когда состояние wifi, состояние bluetooth или что-то еще изменилось (я бы рекомендовал в отдельном потоке), но в целом он должен работать для вашей проблемы.

Ответ 5

Вы можете использовать следующее:

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;
}

Ссылка из Проверить подключение к Интернету Android

Ответ 6

Проверка подключения к Интернету кажется прекрасной. О подключении Bluetooth, попробуйте следующее:

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

Ваша идеальная функция будет выглядеть примерно так:

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() 
}

Думаю, вам понадобятся эти разрешения:

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