0

未知のSSIDのリストをスキャンし、あらかじめ定義されたいくつかのパスワードでそのアクセスポイントにログインする必要があります。成功した場合は、次のタスクを続行します。失敗した場合は、次のSSIDにログインしてみてください。Android - SSIDを知る方法がパスワードで失敗しましたか?

私が作業している1を参照して、私はできる限り多くを登録しよう:

receiverWifi = new WifiReceiver(); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
registerReceiver(receiverWifi, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION)); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.NETWORK_IDS_CHANGED_ACTION)); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.ACTION_PICK_WIFI_NETWORK)); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE)); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); 
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)); 

私はこのようなパスワードを使用してSSIDを接続します

WifiConfiguration wifiConfig = new WifiConfiguration(); 
wifiConfig.SSID = String.format("\"%s\"", ssid); 
wifiConfig.preSharedKey = String.format("\"%s\"", password); 
netId = mainWifi.addNetwork(wifiConfig); 
if (netId != -1) { 
    if (mainWifi.disconnect()) 
     if (mainWifi.enableNetwork(netId, true)) 
      if (mainWifi.reconnect()) { 
      } 
} 

そして、それは接続に流れなかった:

class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 

     } else if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 

      ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 

      if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI && 
        networkInfo.isConnected()) { 
       WifiInfo wifiInfo = mainWifi.getConnectionInfo(); 
       ssid = wifiInfo.getSSID(); 
       //able to know Wifi connected to ssid here 
      } 

      } else if (intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 
     } 
    } 
} 

しかし、このSSIDでパスワードが失敗した場合はどうすればわかりますか?私はパスワードが失敗した場合、コードは次のSSIDを試みるかどうかを知りたい。しかし、パスワードの試行が失敗したことを知るためにどのアクションを使用すべきですか?現在、私はただandroid.net.wifi.STATE_CHANGEアクションが受信し続けていることに気づいたが、それはパスワードが失敗したことを意味しない。

答えて

1

、常に表示されていませんonRecive

if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { 
    int linkWifiResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 123); 
    if (linkWifiResult == WifiManager.ERROR_AUTHENTICATING) { 
     Log.i(TAG,"pwd error); 
    } 
} 
+2

おかげで、私は 'WifiManagerに気づきました。 ERROR_AUTHENTICATINGは必ずしも機能しません。 –

+0

私のために働いていません。 – AJit

2

WifiManager.ERROR_AUTHENTICATINGで怒鳴るのコードを追加し、アクション "SUPPLICANT_STATE_CHANGED_ACTION" のBrocastReciverを追加するので、私はこれで終わる:

class WifiReceiverResult extends BroadcastReceiver { 

    boolean assoc = false; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { 

      SupplicantState supl_state = ((SupplicantState)intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)); 
      switch (supl_state) { 
       case ASSOCIATED: 
        assoc = true; 
        break; 
       case FOUR_WAY_HANDSHAKE: //need this because ASSOCIATED sometimes skipped 
        assoc = true; 
        break; 
       case DISCONNECTED: 
        if (assoc) { 
         assoc = false; 
         //... try next SSID 
        } 
        break; 

     ... 

ためにのみ有効DISCONNECTEDASSOCIATED OR FOUR_WAY_HANDSHAKEが1回表示されるので、assocという変数を安全なガードとして配置します。もちろん、「無効なパスワード」を反映するのは100%正確ではありませんが、他の選択肢はありません。

[UPDATE]が、それ以外の場合は、数分後にのみ成功(それは私の要件では受け入れられないですが、私がしようと、より良いかもしれませんが、上記の最終的なコードは、あなたもDISCONNECTEDのタイムアウトと最大試みを処理する必要がありますされていないことを心に留めておきます次のSSIDを確認してから、もう一度SSIDのリスト全体を再試行してください)、SCANNING ...ステージを無限に繰り返してください。

これは私が何をすべきかです:

Handler myHandler = new Handler(Looper.getMainLooper()); 
Runnable runner = new Runnable() { 
    @Override 
    public void run() { 
     if (isTimeout) { 

      //Network idle timeout 15 seconds, do scanning next again 
      List<WifiConfiguration> list = mainWifi.getConfiguredNetworks(); //here might hang for 20 seconds ! 
      for(WifiConfiguration i : list) { 
       mainWifi.removeNetwork(i.networkId); 
       mainWifi.saveConfiguration(); 
      } 
      connectAPWithTimeout(); 
     } 
    } 
}; 
... 
void connectAPWithTimeout() { 
    if (runner != null) { 
     myHandler.removeCallbacks(runner); 
    } 
    myHandler.postDelayed(runner, 15000); 
    isTimeout = true; 
    try { 
     receiverWifiR.connectToAP(); //my custom method to connect to next ssid hotspot 
    } catch (NullPointerException e) { 
    } 
} 
... 
class WifiReceiverResult extends BroadcastReceiver { 
int attempt = 0; 
... 
@Override 
public void onReceive(Context context, Intent intent) { 
... 
        case DISCONNECTED: 
         attempt+=1; 
         if (assoc || attempt > 2) { 
          isTimeout = false; 
          assoc = false; 
          attempt = 0; 
          connectAPWithTimeout(); 
         } 
         break; 

とクラスを終了し、クラスを再試行するか、前に接続したときにコールバックを削除することを忘れないでください:

isTimeout = false; 
if (runner != null) { 
    myHandler.removeCallbacks(runner); 
} 
関連する問題