예, startScan()
은 하나의 단일 스캔 만 요청합니다.
if (intent.getAction().equals(..))
상태를 제거 할 수 있습니다. 다른 것은 괜찮은 것 같습니다.
그냥 명확하게하기 - 나의 목표는, 무선 네트워크 목록이 변경 될 때마다 호출 을 얻을 것이다 수신기를 위해 "스캔 시작"버튼을 클릭 을하지 않고.
AFAIK Wi-Fi 네트워크가 변경 될 때마다 알림을받을 수 없습니다. startScan
으로만 스캔을 요청할 수 있으며 물론 스레드 또는 처리기를 사용하여 startScan
번으로 반복해서 호출 할 수 있습니다.
docs
는
때 SCAN_RESULTS_AVAILABLE_ACTION
를 호출 말 "액세스 포인트 스캔이 완료하고, 결과는 요청자에서 사용할 수 있습니다". 스캔이 진행되는 방법과시기는 요청자의 구현에 따라 다릅니다.
Elenkov 그 글
"안드로이드 장치는 원래 wpa_supplicant 코드를 거의 포함하지 않으며 포함 된 구현은 기본 SoC와의 호환성 향상을 위해 종종 수정됩니다". 사용 가능한 액세스 포인트와 Ad Hoc 네트워크에 대한 액세스 포인트에 대한
스캔
이 예제를 검색합니다. 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);
}
내가 그 경우 "단일 스캔"을 요청하여 무엇을 의미하는지이었다 - 와이파이 네트워크를 업데이트 할 때 나는 onResponse 통보 받고 계속됩니다? 코드를 실행하고 설정 -> Wifi 설정으로 이동하면 onResponse가 여러 번 호출되기 때문에 그럴 것 같습니다. 그래서, 그냥 startScan()을 여러 번 호출 할 필요는 없습니다. 한 번 충분합니다. 맞습니까? –
그냥 "Wi-Fi 네트워크 목록이 변경 될 때마다 호출되는 수신기가 있어야한다는 내 목표는"검색 시작 "버튼을 클릭하지 않아도됩니다. –
답을 업데이트했습니다. 너의 대답에 대해 – gus27