はい、startScan()
は、1回のスキャンのみを要求します。
if (intent.getAction().equals(..))
の状態を取り除くことができます。他のものは大丈夫と思われる。
ちょうどそれを明確にする - 私の目標は、WiFiネットワークリストが変更されるたびに呼び出さ を取得する受信機を持っているために、「スタートスキャン」ボタンをクリックする を持たずに。
AFAIK Wi-Fiネットワークのいずれかが変更されたときに通知を受けることはできません。 startScan
でのみスキャンをリクエストできます。もちろん、スレッドまたはハンドラを使用してstartScan
を繰り返し呼び出すことができます。
docs
は
ときSCAN_RESULTS_AVAILABLE_ACTION
が呼ばれると言う「アクセスポイントのスキャンが完了した、との結果がサプリカントから入手できます」。スキャンがいつ、どのように行われるかは、サプリカントの実装によって異なります。
Elenkovには、
"Androidデバイスには元のwpa_supplicantコードはほとんど含まれていません。含まれている実装は、基礎となるSoCとの互換性を改善するために変更されることがよくあります"。
アクセスポイントのスキャン
この例では、利用可能なアクセスポイントおよびアドホックネットワークをスキャンします。 btnScan
は、WifiManager.startScan()
メソッドによって開始されたスキャンを有効にします。スキャンの後、WifiManager
はSCAN_RESULTS_AVAILABLE_ACTION
インテントを呼び出し、WifiScanReceiver
クラスはスキャン結果を処理します。結果はTextView
に表示されます。
public class MainActivity extends AppCompatActivity {
private final static String TAG = "MainActivity";
TextView txtWifiInfo;
WifiManager wifi;
WifiScanReceiver wifiReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wifi=(WifiManager)getSystemService(Context.WIFI_SERVICE);
wifiReceiver = new WifiScanReceiver();
txtWifiInfo = (TextView)findViewById(R.id.txtWifiInfo);
Button btnScan = (Button)findViewById(R.id.btnScan);
btnScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "Start scan...");
wifi.startScan();
}
});
}
protected void onPause() {
unregisterReceiver(wifiReceiver);
super.onPause();
}
protected void onResume() {
registerReceiver(
wifiReceiver,
new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
);
super.onResume();
}
private class WifiScanReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
List<ScanResult> wifiScanList = wifi.getScanResults();
txtWifiInfo.setText("");
for(int i = 0; i < wifiScanList.size(); i++){
String info = ((wifiScanList.get(i)).toString());
txtWifiInfo.append(info+"\n\n");
}
}
}
}
権限
次の権限がのAndroidManifest.xmlで定義する必要があります。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
android.permission.ACCESS_WIFI_STATE
WifiManager.getScanResults()
を呼び出すために必要です。 android.permission.CHANGE_WIFI_STATE
がなければ、WifiManager.startScan()
でスキャンを開始することはできません。
APIレベル23以上(Android 6.0以上)のプロジェクトをコンパイルする場合は、android.permission.ACCESS_FINE_LOCATION
またはandroid.permission.ACCESS_COARSE_LOCATION
のいずれかを挿入する必要があります。さらに、許可を要求する必要があります。あなたの主な活動のonCreate
方法で:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
String[] PERMS_INITIAL={
Manifest.permission.ACCESS_FINE_LOCATION,
};
ActivityCompat.requestPermissions(this, PERMS_INITIAL, 127);
}
が、私はその場合は、「単一のスキャン」を尋ねることによって何を意味するのかをだった - WiFiネットワークを更新しているとき、私はonResponseに通知し続けるのだろうか?コードを実行して「設定」 - >「Wifi設定」に移動すると、onResponseが複数回呼び出されるためです。ですから、startScan()を何度も呼び出す必要はありません。 –
ちょうどそれを明確にする - 私の目標は、 "スキャンを開始"ボタンをクリックすることなく、Wifiネットワークのリストが変化しているたびに呼び出される受信機を持つことです。 –
答えを更新しました。 – gus27