Обнаружить и обработать необходимость входа для Wi-Fi - PullRequest
17 голосов
/ 23 марта 2012

Я использую 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, когда оно перенаправлено
  • Поймайте это исключение в коде активности и откройте веб-представление, чтобы направить их на экран входа в систему
  • После входа в систему wifi-login поздравляет их с хорошо выполненной работой и возвращает их обратно в приложение

Дело в том, что я никогда не получаю это исключение WifiLoginNeeded.Каков предпочтительный способ сделать это с Android?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2013

В более общем случае: вы можете включить что-то в ваш публичный 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. Пожалуйста, загрузите обновление там. »)

0 голосов
/ 25 октября 2012

Попробуйте это небольшое решение, оно поможет

   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;
        }
0 голосов
/ 27 марта 2012

Пожалуйста, проверьте код ниже.Возможно, вам будет полезно проверить, какие соединения вы используете.

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