2012-03-22 5 views
17

私はAndroidアプリでHttpClient 4.1を使用しています。自分のアプリのAPIリクエストを「ログインまたはWi-Fiの支払いが必要です」のいずれかで傍受していることを賢明にしています。wifiにログインする必要性を検出して処理する

ユーザーがログインできるようにwebviewをポップアップしたいと思います。

私は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; 
    } 
}); 

とを::

この

は、私は現在しようとしているものです

Uri uri = Uri.parse("http://our-site.com/wifi-login"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(intent); 

思考:ショーの無線LAN画面がこれを行う

try { 
    response = httpClient.get(url); 
} catch (WifiLoginNeeded e){ 
    showWifiLoginScreen(); 
} 

これはです:

  • 私のAPIは、それが活動のコードで例外とWebViewのポップは彼らが彼ら一度ログイン画面
  • に向け得るために
  • キャッチをリダイレクトだときに、私は私の特別なのRuntimeExceptionをスローするように設定するのHttpClient合法
  • をリダイレクトすることはありませんログイン、WIFI-ログインが良い仕事上でそれらを祝福し、事は、私はそのWifiLoginNeeded例外を取得することはありません、バックアプリ

にそれらを要求します。 Androidでこれを達成するための好ましい方法は何ですか?

+2

まず、httpサーバが正しいhttpReponse(301または302)を返すことを確認します。 – yorkw

+0

問題は、私のサーバーがリダイレクトをしていないことです。それは、「高価なWiFiにログインする」ページにすべてを示すWiFiアクセスポイントの1つです。だから私は、リダイレクトされたHTTPコールについて考えることができるすべてのケースをキャッチする必要があります。 –

+2

あなたが期待するリダイレクトのタイプではないかもしれません - あなたが期待するコードが生成されていることを確認してください。アクセスポイントはあなたが期待している特定のHTTPコードを返す必要はなく、[200]を送信してアクセスポイントのログイン画面にあなたを導いてくれても問題ないことを示すことができます。 サイトのIPアドレスを保存し、最新のhttp要求によって返されたIPアドレスと比較することができます。それらが異なる場合は、ログイン画面を呼び出します。 – RightHandedMonkey

答えて

-2

以下のコードを確認してください。使用している接続の種類を確認すると便利です。

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 
} 
+0

これには余分な権限が必要です。可能であれば、これを避けたいと考えています。すでにACCESS_WIFI_STATE権限を使用している場合は、これが良い方法です。 –

-1

それがより一般的なケースとして

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

を助けるこの小さなソリューションをお試しください:あなたは、「Hello World」のか、「Pingの」メッセージのようなあなたの公開APIで何かを含めることができます。

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 } 

サーバーに接続して「ping」しようとします。応答が期待どおりの形式で返されない場合は、選択したWebブラウザを使用して結果を処理するために、同じURLをインテントとして投げてください。

企業の代理人(「会社XYZはあなたを禁じます!」)、および将来自社のAPIの互換性のない変更(「申し訳ありませんが、APIの12歳のバージョンはサポートしていません。そこにアップデートをダウンロードしてください。 ")

関連する問題