2009-07-30 5 views
11

신호 강도가 변경되면 알림을 받게됩니다. I)는 다음과 같은 방법을 만들고에서 onCreate (에 전화를 시도 :이 방법이 제대로 작성된 경우 사람이 확인할 수 있다면 감사하겠습니다Android : WiFi 신호 강도 모니터링 방법

private void initializeWiFiListener(){ 
    Log.i(TAG, "executing initializeWiFiListener"); 

    String connectivity_context = Context.WIFI_SERVICE; 
    final WifiManager wifi = (WifiManager)getSystemService(connectivity_context); 

    if(!wifi.isWifiEnabled()){ 
     if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){ 
      wifi.setWifiEnabled(true); 
     } 
    } 

    registerReceiver(new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      WifiInfo info = wifi.getConnectionInfo(); 
      //TODO: implement methods for action handling 
     } 

    }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION)); 
} 

. 앱을 실행하려했지만 알리미를받지 못했고 신호 강도가 디버그를 실행하는 위치에서 일정 할 수 있거나 무엇인가가 없어서인지 여부가 확실하지 않습니다.

감사합니다.

답변

12

먼저 매니페스트에 에 <uses-permission>을 입력해야합니다. 나는 성공적으로받은 경우

wifi.startScan(); 

다음 :

둘째, 나는 하나의 연결에 대한 알림에 대한 모르겠지만, 라디오가보고있는 모든 알림을 얻기 위해, 당신은 스캔을 시작할 수 있습니다 결과, IntentFilterWifiManager.SCAN_RESULTS_AVAILABLE_ACTION을 사용했습니다.

그런 다음 수신기에서 신호 강도가 포함 된 WifiManager 개체의 getScanResults()을 사용합니다.

이런 식으로 중지하려면 unregisterRecever()으로 전화하면됩니다 (참조 용으로 계속 사용하기를 원할 것입니다). 필자는 스캐닝 코드가 현재 연결을 확인하기 위해 수정할 수 있는지 직접 테스트하지는 않았지만 많은 결과가 있음을 알고 있습니다. Wi-Fi 신호가 자주 빠르게 바뀝니다. 단일 연결을 모니터링하는 경우, 검색 결과를 필터링하고 장치가 현재 연결되어있는 장치를 검색 할 수도 있습니다.

조금 도움이 되었기를 바랍니다. 내가

@Override 
protected void onResume() { 
    super.onResume(); 
    networkStateReceiver = new NetworkStateReceiver(this); 
    this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.wifi.SCAN_RESULTS")); 
    networkStateReceiver.registerListener(this); 
} 

이 그리고 내 수신기의 onReceive의 모습을 내 앱에서

: startScan() 매에

@Override 
public void onReceive(Context context, Intent intent) { 
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnectedOrConnecting()) { 
     switch (networkInfo.getType()) { 
      case ConnectivityManager.TYPE_ETHERNET: 
       this.networkStateMessage = new NetworkStateMessage(networkInfo); 
       break; 
      case ConnectivityManager.TYPE_WIFI: 
       this.networkStateMessage = new NetworkStateMessage(networkInfo, wifiManager.getConnectionInfo()); 
       worker.schedule(new Runnable() { 
        @Override 
        public void run() { wifiManager.startScan(); } 
       }, 5, TimeUnit.SECONDS); 
       break; 
      default: 
       this.networkStateMessage = null; 
       break; 
     } 
    } 
    notifyStateToAll(this.networkStateMessage); 
} 

아이디어가있다

+2

대답을 조금씩 개발해 주시겠습니까? – Vervatovskis

0

그냥 내 솔루션을 드롭하기 Wi-Fi가 활성 네트워크 인 경우 5 초.

관련 문제