2009-07-30 14 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

最初にマニフェストにACCESS_WIFI_STATE<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秒です。

関連する問題