2

여기 내 코드라고 안한다.안드로이드 와이파이 스캔은 SCAN_RESULTS_AVAILABLE_ACTION에 대한 브로드 캐스트 리시버는

와이파이 목록이 변경되고 있습니다 (테스트 한 결과). 다만 앱에 남아있는 경우 onReceive이 호출되지 않습니다. 마지막으로 호출 할 onReceive하게 무엇

은 ->와이파이 설정 - 응용 프로그램을 실행이 실행하고 설정에 안드로이드 휴대폰에가는 떠날 것입니다. 거기 가면 갑자기 List가 업데이트되고 onReceive이 호출됩니다.

여기에 문제가 있습니까?

  1. 합니까 wifiManager.startScan(); 한 번만 스캔을 실행? 들어오는 "스캔 결과"를 계속 듣는 기능입니까?

  2. 분명히 왜 수신기가 호출되지 않습니까?

답변

3

예, startScan()은 하나의 단일 스캔 만 요청합니다.

if (intent.getAction().equals(..)) 상태를 제거 할 수 있습니다. 다른 것은 괜찮은 것 같습니다.

그냥 명확하게하기 - 나의 목표는, 무선 네트워크 목록이 변경 될 때마다 호출 을 얻을 것이다 수신기를 위해 "스캔 시작"버튼을 클릭 을하지 않고.

AFAIK Wi-Fi 네트워크가 변경 될 때마다 알림을받을 수 없습니다. startScan으로만 스캔을 요청할 수 있으며 물론 스레드 또는 처리기를 사용하여 startScan 번으로 반복해서 호출 할 수 있습니다.

docs

SCAN_RESULTS_AVAILABLE_ACTION를 호출 말 "액세스 포인트 스캔이 완료하고, 결과는 요청자에서 사용할 수 있습니다". 스캔이 진행되는 방법과시기는 요청자의 구현에 따라 다릅니다. Elenkov 그 글 "안드로이드 장치는 원래 wpa_supplicant 코드를 거의 포함하지 않으며 포함 된 구현은 기본 SoC와의 호환성 향상을 위해 종종 수정됩니다". 사용 가능한 액세스 포인트와 Ad Hoc 네트워크에 대한 액세스 포인트에 대한


스캔

이 예제를 검색합니다. btnScanWifiManager.startScan() 방법으로 시작된 검사를 활성화합니다. 검사 후 WifiManagerSCAN_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_STATEWifiManager.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); 
} 
+0

내가 그 경우 "단일 스캔"을 요청하여 무엇을 의미하는지이었다 - 와이파이 네트워크를 업데이트 할 때 나는 onResponse 통보 받고 계속됩니다? 코드를 실행하고 설정 -> Wifi 설정으로 이동하면 onResponse가 여러 번 호출되기 때문에 그럴 것 같습니다. 그래서, 그냥 startScan()을 여러 번 호출 할 필요는 없습니다. 한 번 충분합니다. 맞습니까? –

+0

그냥 "Wi-Fi 네트워크 목록이 변경 될 때마다 호출되는 수신기가 있어야한다는 내 목표는"검색 시작 "버튼을 클릭하지 않아도됩니다. –

+0

답을 업데이트했습니다. 너의 대답에 대해 – gus27