アンドロイド - どのようにアクセスポイントをスキャンし、最も強い信号を選択するには?

StackOverflow https://stackoverflow.com/questions/2827662

質問

私は現在、アクセスポイント、アクセスポイントが最良の信号を持っている計算をスキャンし、そのアクセスポイントに接続しますアンドロイドでクラスを記述しようとしています。

アプリケーションが移動してスキャンして、外出先での新しいアクセスポイントに接続することができるようになりますので。

私は、最良の信号作業のスキャニングと計算しています。

しかし、とき、それは私が問題を抱えています最適なアクセスポイントへの取り付けに来ています。

enableNetworkは(NETID、othersTrueFalse)アクセスポイントに取り付けるための唯一の方法であることが表示されますが、私が最も強い信号を持つアクセスポイントのIDを取得することはできませんよ、私のスキャン結果から、この問題が発生します。

これは私のコードです:

<時間>
public void doWifiScan(){

  scanTask = new TimerTask() {
  public void run() {
      handler.post(new Runnable() {
          public void run() {
               sResults = wifiManager.scan(getBaseContext()); 
               if(sResults!=null)
               Log.d("TIMER", "sResults count" + sResults.size());
               ScanResult scan = wifiManager.calculateBestAP(sResults);
               wifiManager.addNewAccessPoint(scan);
           }
       });
    }};

    t.schedule(scanTask, 3000, 30000); 
}
<時間>
public ScanResult calculateBestAP(List<ScanResult> sResults){

     ScanResult bestSignal = null;
        for (ScanResult result : sResults) {
          if (bestSignal == null
              || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0)
            bestSignal = result;
        }

        String message = String.format("%s networks found. %s is the strongest. %s is the bsid",
                sResults.size(), bestSignal.SSID, bestSignal.BSSID);

        Log.d("sResult", message);
        return bestSignal;
}
<時間>
public void addNewAccessPoint(ScanResult scanResult){

    WifiConfiguration wc = new WifiConfiguration();
    wc.SSID = '\"' + scanResult.SSID + '\"';
    //wc.preSharedKey  = "\"password\"";
    wc.hiddenSSID = true;
    wc.status = WifiConfiguration.Status.ENABLED;        
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    int res = mainWifi.addNetwork(wc);
    Log.d("WifiPreference", "add Network returned " + res );
    boolean b = mainWifi.enableNetwork(res, false);        
    Log.d("WifiPreference", "enableNetwork returned " + b );

}
<時間> 私はaddNewAccessPointを使用しようとすると、私は重複の負荷で終わると実際に接続しないように、(ScanResult scanResultは)それだけで、最高の信号に1と同じ名前の設定がアプリケーションのリストに別のAPを追加しますそれらます。

缶誰ポイント私より良い解決の方向に?

役に立ちましたか?

解決

単に変更

boolean b = mainWifi.enableNetwork(res, false);

boolean b = mainWifi.enableNetwork(res, true); 

他のヒント

あなたの質問のポイントに詳しいです。まず、あなたは最高の信号強度を有するスキャン結果を決定しています。あなたはそれを持っていたら、あなたはまた、デバイス上ですでに無線LAN構成のリストを取得し、最も強い信号とスキャン結果がすでにデバイスで構成されていないことを確認する必要があります。もしそうであれば、あなたがそうであるように、新しいものを作成していない場合は、単純に、それを有効にします。これは重複のconfigsを防ぐことができます。

private int findExistingNetworkConfig(String ssid) {
    if (ssid != null && !ssid.isEmpty()) {
        WifiManager wifiManager = (WifiManager) mContextRef.get()
                .getSystemService(Context.WIFI_SERVICE);
        for (WifiConfiguration wifiConfig : wifiManager
                .getConfiguredNetworks()) {
            if (ssid.equals(wifiConfig.SSID)) {
                return wifiConfig.networkId;
            }
        }
    }
    // Didn't find a matching network ssid
    return -1;
}

そして、はい、ネットワークを有効にする場合は「真」パラメータを使用してください。これは、あなたが意図したネットワークへの接続を確認するのに役立ちます。

wifiManager.enableNetwork(mNetID, true);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top