web-dev-qa-db-ja.com

android 6.0.1インターネットにアクセスせずにwifi接続を強制する

これには多くの同様の質問があります(google for:「インターネットアクセスが検出されませんでした。自動的に再接続しません。」またはAndroidプログラムでwifi接続を強制します)。

私は答えがあると思った here が、6.0.1の更新をインストールした後、動作が停止した(セキュリティパッチが1つある可能性がある)。

これは 動作の変更 のようです。

キオスクタイプのアプリを実行し、プログラムでインターネットに接続されていない特定のワイヤレスネットワークに接続したい、2013年の6.0.1を搭載したNexus 7がいくつかあります。各タブレットには、192.168.0.xxという形式の一意の静的IPアドレスがあります。通常のJavaソケットコンストラクターを使用し、NetworkInterface.getNetworkInterfaces()を使用してインターフェイスがアップしているかどうかを確認します。

手動接続が行われました。常に接続するかどうかを尋ねるダイアログが表示されることがあります。私はいつもはいチェックします。

しかし、wifiは言う:ルーターの電源を入れ直した後、「インターネットアクセスが検出されませんでした。自動的に再接続しません」。

切断、有効化、再接続を実行しても機能しません。よくてもそれは取得します:ip6-localhost/:: 1。

誰かがリクエストオブジェクト、またはbindProcessToNetworkを使用して運を持っていますか?

編集: 関連

編集:問題は次のように思われます:CAPTIVE_PORTAL_DETECTION_ENABLED-この文字列はソースで定義されているようです

public static final String
        CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled";
    ...
    MOVED_TO_GLOBAL.add(Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED);

android.provider.Settings $ SettingNotFoundException:captive_portal_detection_enabledを明示的に使用するとスローされますAndroid studio。

また、設定リストをグローバルに実行しても、定数は含まれません。

adbシェル設定を編集して、グローバルなcaptive_portal_detection_enabled 0を設定すると機能するように見えますが、ルーターの電源を入れ直すと、フィールドでこれを行うことはできません。この値は、タブレットの電源を入れ直しても持続するようです。そして、この値は設定リストグローバルに表示されます。また、生の文字列を使用します:Settings.Global.getInt(getContentResolver()、 "captive_portal_detection_enabled");現在は0を返します。

編集:必要な設定のように見えます:Android.permission.WRITE_SECURE_SETTINGSが、もちろんシステムアプリではないため、マニフェストに入れると失敗します。

編集:シェルコマンドを実行しようとすると、Java.lang.SecurityExceptionがスローされるため、adb :(からコマンドを発行する必要があるようです

ありがとう

13
Ray Tayek

グローバル設定captive_portal_detection_enabledを0(false)に設定してみてください。

実際に起こっていることは、デフォルトでは、wifiに接続するたびに、FWはサーバー(通常はgoogle)に対してテストを行い、それがキャプティブwifi(ログインが必要)かどうかを確認します。したがって、Wi-FiがGoogleに接続されていない場合、このチェックは失敗します。その後、デバイスはwifiにインターネット接続がないことを認識し、それに自動接続しません。

この設定を0に設定すると、このチェックが回避されます。

プログラム的にSettings.Global.putInt(getContentResolver(), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0);

テストの目的でadbを使用して実行できます。

adb Shell settings put global captive_portal_detection_enabled 0

そして、次のようにその値を取得します。

adb Shell settings list global | grep "captive"

私見これは非常に良いことではありません。ユーザーの設定を変更しているため、多くのFWはユーザー自身がこれを有効/無効にするための詳細設定さえ提供していません。 (Googleはしません)。しかし、多分それはあなたのニーズに合っています。

それが役に立てば幸い!

11
Olaia

一種のハッキング技術である非ルートソリューション。 :P

  1. 電話を再起動し、インターネット以外のWifiに接続します。
  2. [設定]に移動して、新しいユーザーを作成します。
  3. 「接続を確認しています」が表示されるまで続行、続行、続行します。
  4. 「接続を確認しています」と表示されたら、すぐにスマートフォンの電源を切ります。
  5. もう一度電話の電源を入れます。「所有者」ユーザーになります。そのままにしてください。
  6. Wifiを切り替えると、感嘆符がすぐに消えます:)
  7. その新しいユーザーを削除するか、そのままにしておきます。

理由はわかりませんが、うまくいきます...

0
MewX