0

알 수없는 SSID 목록을 스캔하고 사전 정의 된 몇 가지 암호로 해당 액세스 지점에 로그인해야한다는 요구 사항이 있습니다. 성공하면 다음 작업을 계속하십시오. 실패하면 다음 SSID에 로그인하십시오.안드로이드 - 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()) { 
      } 
} 

그리고 연결에 흐름 않은 :

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를 연결

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 또는 FOUR_WAY_HANDSHAKE이 한 번 표시되면 assoc 변수를 안전 가드로 지정합니다. 물론 "유효하지 않은 암호"를 반영하는 것이 100 % 정확하지는 않지만 더 좋은 선택은 없습니다.

[업데이트]이 그렇지 않으면 몇 분 만 성공 (내 요구 사항에서 받아 들일 수없는, 난 시도 나은 수, 위의 최종 코드는, 당신은 또한 DISCONNECTED의 시간 제한 및 최대 시도를 처리해야되지 않는다는 것을 명심 다음 SSID를 입력 한 다음 SSID의 전체 목록을 다시 시도하십시오) 무대 스캔 ... 무한대로 반복하십시오.

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); 
} 
관련 문제