Обнаружение и обращение с необходимостью входа в систему для Wi-Fi
Я использую HttpClient
4.1 в приложении для Android и пытаюсь понять, что мои запросы API приложений перехватываются одним из этих экранов "вам нужно войти в систему или оплатить Wi-Fi".
Я хочу открыть веб-просмотр, позволяющий пользователю войти в систему.
Я пытаюсь перехватить перенаправление в httpClient, но я не увенчался успехом.
Это то, что я сейчас пытаюсь сделать:
this.client = new DefaultHttpClient(connectionManager, params);
((DefaultHttpClient) this.client).setRedirectStrategy(new DefaultRedirectStrategy() {
public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) {
boolean isRedirect = Boolean.FALSE;
try {
isRedirect = super.isRedirected(request, response, context);
} catch (ProtocolException e) {
Log.e(TAG, "Failed to run isRedirected", e);
}
if (!isRedirect) {
int responseCode = response.getStatusLine().getStatusCode();
if (responseCode == 301 || responseCode == 302) {
throw new WifiLoginNeeded();
// The "real implementation" should return true here..
}
} else {
throw new WifiLoginNeeded();
}
return isRedirect;
}
});
И затем в моей деятельности:
try {
response = httpClient.get(url);
} catch (WifiLoginNeeded e){
showWifiLoginScreen();
}
где экран show wifi делает это:
Uri uri = Uri.parse("http://our-site.com/wifi-login");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
Мысль такова:
- Мой API никогда не будет перенаправлять законно
- Итак, я настраиваю HttpClient, чтобы бросать мое специальное исключение RuntimeException при перенаправлении
- Поймайте это исключение из кода операции и позовите Webview, чтобы получить их на экране входа в систему.
- После входа в систему wifi-login поздравляет их с хорошо выполненной работой и приглашает их обратно в приложение.
Дело в том, что я никогда не получаю исключение WifiLoginNeeded. Каков предпочтительный способ выполнить это с Android?
Ответы
Ответ 1
Как более общий случай: вы можете включить что-то в свой общедоступный API, как сообщение "Hello World" или "Ping".
GET http://api.example.com/1.0/ping HTTP/1.1
Accepts: text/json
Content-Type: text/json
{ ping: "ok", currentAPIVersion: 1.1, minAPIVersion: 1.0 }
Попытайтесь подключиться и "пинговать" ваш сервер. Если ответ не возвращается в ожидаемом вами формате, добавьте тот же URL-адрес, что и намерение для пользователя, чтобы иметь дело с результатами, используя свой веб-браузер.
Это также будет обрабатывать: корпоративные прокси ( "компания XYZ запрещает вам!" ) и несовместимые изменения в вашем собственном API в будущем ( "извините, мы больше не поддерживаем эту 12-летнюю версию API". обновление там. ")
Ответ 2
Попробуйте это небольшое решение, это поможет
public boolean haveNetworkConnection() {
cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
Boolean haveConnectedWifi = false;
Boolean haveConnectedMobile = false;
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
return haveConnectedWifi || haveConnectedMobile;
}
Ответ 3
Пожалуйста, проверьте приведенный ниже код. Возможно, вам будет полезно проверить, какие подключения вы используете.
WifiManager lWifiManager = (WifiManager) OpenYouTubePlayerActivity.this.getSystemService(Context.WIFI_SERVICE);
TelephonyManager lTelephonyManager = (TelephonyManager) OpenYouTubePlayerActivity.this.getSystemService(Context.TELEPHONY_SERVICE);
////////////////////////////
// if we have a fast connection (wifi or 3g)
if( (lWifiManager.isWifiEnabled() && lWifiManager.getConnectionInfo() != null && lWifiManager.getConnectionInfo().getIpAddress() != 0) ||
( (lTelephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS ||
/* icky... using literals to make backwards compatible with 1.5 and 1.6 */
lTelephonyManager.getNetworkType() == 9 /*HSUPA*/ ||
lTelephonyManager.getNetworkType() == 10 /*HSPA*/ ||
lTelephonyManager.getNetworkType() == 8 /*HSDPA*/ ||
lTelephonyManager.getNetworkType() == 5 /*EVDO_0*/ ||
lTelephonyManager.getNetworkType() == 6 /*EVDO A*/)
&& lTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED)
){
//Do some thing here
}