16

私の大学にはオープン Wi-Fi アクセス ポイントがありますが、Web を使用する前に電子メールを入力する必要があります。私の問題は、接続が切断され、10 分ごとに電子メールを再入力する必要があるように見えるという点で、Wifi がばかげていることです。

この手順を自動的に実行するために使用できる独自のアプリを作成したかったのですが、Wifi アクセス ポイントにブラウザーのログイン ページがあるかどうかを検出するための適切で簡単な方法に関するドキュメントが見つからないようです。Android でこの情報を取得する方法はありますか、それとも何かへの接続が常に 1.1.1.1 にリダイレクトされるかどうかを確認するだけですか?

4

5 に答える 5

16

ドキュメントの「ネットワーク サインオンHttpUrlConnection処理」セクションを参照してください。

一部の Wi-Fi ネットワークは、ユーザーがサインオン ページをクリックするまで、インターネット アクセスをブロックします。このようなサインオン ページは、通常、HTTP リダイレクトを使用して表示されます。getURL() を使用して、接続が予期せずリダイレクトされたかどうかをテストできます。このチェックは、getHeaderFields() または getInputStream() を呼び出してトリガーできる応答ヘッダーが受信されるまで有効ではありません。

そこにサンプルコードのスニペットがあります。これが特定の WiFi AP をカバーするかどうかはわかりませんが、試してみる価値はあります。

于 2012-08-15T00:06:44.080 に答える
3

外部 IP アドレス (google.com など) に ping を実行して、応答するかどうかを確認します。

    try {
        Runtime runtime = Runtime.getRuntime();
        Process proc = runtime.exec("ping -c 1 " + "google.com");
        proc.waitFor();     
        int exitCode = proc.exitValue();
        if(exitCode == 0) {
            Log.d("Ping", "Ping successful!";
        } else {
            Log.d("Ping", "Ping unsuccessful.");
        }
    } 
    catch (IOException e) {}
    catch (InterruptedException e) {}

唯一の欠点は、WiFi アクセス ポイントにインターネット接続がない場合に Web ログインが必要になることです。

@CommonsWareリダイレクトページを表示してもホストが常に変更されるとは限らないため、UrlConnectionを開いてホストを確認するよりも、これがより良い答えだと思います。たとえば、Belkin ルーターでテストしたところ、ブラウザーに入力した内容はそのまま残りますが、独自のページが表示されます。このため、urlConnection.getUrl().getHost() は本来あるべきものを返します。

于 2014-08-16T17:36:57.010 に答える
2

@FlyWheel は正しい道を進んでいると思いますが、http: //clients1.google.com/generate_204 を使用します。204 が返されない場合は、キャプティブ ポータルの背後にいることがわかります。204 を取得するまでこれをループで実行できます。204 の場合、キャプティブ ポータルの背後にいないことがわかります。

@FlyWheel は次のように書いています: 唯一の欠点は、WiFi アクセス ポイントにインターネット接続がない場合に Web ログインが必要になることです。

これは、android.net.conn.CONNECTIVITY_CHANGE に受信機を登録することで解決できます。接続の Supplicant State を調べることで、Wifi がオンになっていて接続されているかどうかを確認できます。

ここにスニペットがありますが、私はそれを実行しませんでした:

WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wm.getConnectionInfo();
SupplicantState suppState = wifiInfo.getSupplicantState();

if (wm.isWifiEnabled()) {
   if (suppState == SupplicantState.COMPLETED){
      // TODO - while loop checking generate_204 (FlyWheels code)Using intent service.
   }
}

SupplicantState が COMPLETED か ASSOCIATED かは覚えていません。確認する必要があります。ブロードキャスト レシーバの寿命は短いため、generate_204 のチェックには IntentService を使用する必要があります。

于 2016-09-01T22:05:00.177 に答える