ANDROID: если WiFi включен и активен, запустите намерение - PullRequest
15 голосов
/ 28 ноября 2009

Вот что я хотел бы сделать:

=> ЕСЛИ WiFi включен и активен, запустите намерение (фактически это WebView, который получает свое содержимое => инструкции моего приложения в Интернете)

=> Если НЕТ, то я бы запустил другое намерение, чтобы я не показывал веб-представление с «Веб-страница недоступна ... Веб-страница на http://www.mywebsite.com может быть временно недоступна или может иметь переехал ... "

Я изначально пытался использовать

, если (wifi.isWifiEnabled ())

но это не говорит, является ли соединение Wi-Fi АКТИВНЫМ или нет. Это говорит только о том, что пользователь включил переключатель. Устройство может быть подключено или не подключено ... Это правильно?

Тогда я попытался использовать:

if (wifi.getConnectionInfo (). GetSSID ()! = Null)

но я заметил, что он возвращает строку, даже если соединение было потеряно или было отключено ...?

Как мне тогда поступить?

wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
Intent intent_instructions;

            if (wifi.getConnectionInfo().getSSID()!= null){
                Log.i("Hub", "WiFi is enabled AND active !");
                Log.i("Hub", "SSID = "+wifi.getConnectionInfo().getSSID());
                intent_instructions = new Intent(this, Instructions.class);
            }else{
                Log.i("Hub", "NO WiFi");
                intent_instructions = new Intent(this, Instructions_No_WiFi.class);
            }
            this.startActivity(intent_instructions);

Существует ли более общий способ проверки наличия подключения устройства к Интернету непосредственно перед запуском намерения? будь то через Wifi, 3G и т.д ...

Заранее спасибо за помощь.

Ответы [ 5 ]

20 голосов
/ 02 июля 2011

Вы можете использовать следующий код для проверки подключения:

private static boolean isConnected(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager)
        context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = null;
    if (connectivityManager != null) {
        networkInfo =
            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    }
    return networkInfo == null ? false : networkInfo.isConnected();
}

Убедитесь, что вы зарегистрировали намерение android.net.conn.CONNECTIVITY_CHANGE в своем манифесте, иначе вы никогда не получите уведомление о том, что вы в сети.

Я боролся с этой проблемой последние пару дней и только сейчас понял, что мне нужно зарегистрировать CONNECTIVITY_CHANGE, а не только WIFI_STATE_CHANGED.

8 голосов
/ 26 февраля 2010

Попробуйте android.net.ConnectivityManager.getActiveNetworkInfo(): если возвращается null, у вас нет соединения; если он возвращает объект NetworkInfo, вы можете проверить состояние соединения с помощью NetworkInfo.getState(), а если оно NetworkInfo.State.CONNECTED, то вы подключены, иначе нет.

5 голосов
/ 17 февраля 2010

Вы можете сделать это следующим образом:

  @Override
  public void onReceive(Context context, Intent intent) {

  String action = intent.getAction();

        if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){

         Log.d("WIFI", "WIFI has changed");
         int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
         Log.d("WIFI", "WIFI State = " + wifiState);
         setCurrentWifiState(wifiState);

         }  

Вы получите 0,1,2,3 в зависимости от того, в каком состоянии находится Wi-Fi, так что, например, 2 подключается, вы можете проверить остальные в документах

2 голосов
/ 17 июля 2012

В вашем классе BroadcastReceiver:

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){                
        boolean connected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
        if (connected){
            // start your service here
        }
    }                   
}

И в вашем AndroidManifest.xml убедитесь, что вы зарегистрировались для трансляции android.net.wifi.supplicant.CONNECTION_CHANGE.

<intent-filter >    
    <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
</intent-filter>
0 голосов
/ 07 декабря 2012

isConnected() не работает полностью нормально, исследуйте что-то еще

final ConnectivityManager connMgr = (ConnectivityManager)
        this.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi =
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    final android.net.NetworkInfo mobile =
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if( wifi.isAvailable() && wifi.getDetailedState() == DetailedState.CONNECTED){
        Toast.makeText(this, "Wifi" , Toast.LENGTH_LONG).show();
    }
    else if( mobile.isAvailable() && mobile.getDetailedState() == DetailedState.CONNECTED ){
        Toast.makeText(this, "Mobile 3G " , Toast.LENGTH_LONG).show();
    }
    else
    {   
        Toast.makeText(this, "No Network " , Toast.LENGTH_LONG).show();
    }

этот код проверяет, если у вас есть Wi-Fi или 3G или ничего, в случае, если Wi-Fi включен, но не подключен к сети, или у 3g есть проблемы с сигналом, он обнаруживает эту информацию с DetailedStates

...