ANDROID: если WiFi включен и активен, запустите намерение
Это то, что я хотел бы сделать:
= > Если WiFi включен и активен, запустите намерение (на самом деле это WebView, который получает свой контент = > инструкции моего приложения в Интернете)
= > ЕСЛИ НЕ, тогда я запустил бы другое намерение, чтобы я не показывал WebView с "недоступной веб-страницей... Веб-страница в http://www.mywebsite.com может быть временно опущен или, возможно, переместился..."
Сначала мне пришлось использовать
если (wifi.isWifiEnabled())
но это не означает, что соединение Wifi ACTIVE или нет. В нем говорится только, что пользователь включил переключатель. Устройство может быть подключено или не подключено... Это правильно?
Затем я попытался использовать:
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);
Существует ли более общий способ проверить, подключено ли устройство к Интернету непосредственно перед запуском намерения? будь то через Wi-Fi, 3G и т.д.
Заранее благодарим за помощь.
Ответы
Ответ 1
Для проверки возможности подключения можно использовать следующий код:
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.
Ответ 2
Попробуйте android.net.ConnectivityManager.getActiveNetworkInfo()
: если он возвращает null
, у вас нет соединения; если он возвращает объект NetworkInfo
, вы можете проверить состояние подключения с помощью NetworkInfo.getState()
, а если он NetworkInfo.State.CONNECTED
, то вы подключены, иначе вы не будете.
Ответ 3
Вы можете сделать это следующим образом:
@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, вы можете проверить остальное в документах
Ответ 4
В вашем классе 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>
Ответ 5
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