6

私は Android プログラミングが初めてで、BroadcastReceivers の概念を理解しようとしています。自分自身を助けるために、Wifi 信号強度を監視する小さなアプリケーションを作成しようとしています。

これで、私の理解では、システムによってブロードキャストされた RSSI_CHANGED_ACTION を受信するのを待つことができます。RSSI は頻繁に変更されるはずです。つまり、この通知を頻繁に受け取る必要がありますが、一度も受け取りません。通知を受信したときにメッセージをログに記録するように、コードを最小限に抑えました。

public class RssiActivity extends Activity {

    public BroadcastReceiver rssiReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Log.d("Rssi", "RSSI changed");
        }
    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public void onResume() {
        super.onResume();
        registerReceiver(rssiReceiver, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
        Log.d("Rssi", "Registered");
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(rssiReceiver);
        Log.d("Rssi", "Unregistered");
    }
}

この投稿Android: How to monitor WiFi signal strengthを既に見ましたが、役に立たないようです。ここのコード サンプルも試しましたhttp://android-er.blogspot.com/2011/01/check-rssi-by-monitoring-of.htmlで、RSSI 値も更新されませんでした。これがなぜなのか、私はかなり混乱しています。あなたが私に与えることができるどんな助けでも大歓迎です. ありがとう!

4

3 に答える 3

8

そのため、ユーザーが歩き回ったときに RSSI 値を更新したいなど、あなたと同じ問題があり、RSSI_CHANGED_ACTION を使用して解決できませんでした。

あなたが抱えている問題のように、私のコールバックは正しく呼び出されません。奇妙なことに、アクティビティが作成されたときに一度だけ呼び出され、その後は呼び出されませんでした。

私の回避策

onCreate() で、SCAN_RESULTS_AVAILABLE_ACTION のコールバックを登録します。次に、WifiManager.startScan() を呼び出します。

次に、コールバックで次のようにします。

WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE);
int newRssi = wifiMan.getConnectionInfo().getRssi();
wifiMan.startScan();

これで、コールバックがスキャンを開始し、結果を受け取り、別のスキャンを開始するループができました。

それはひどく、多くの電力を消費しますが、歩き回ると RSSI 値が変化するのを見ることができます。

完全なコード

(onResume と onPause を使用して登録と登録解除を行うことに注意してください。したがって、アクティビティが画面上にある場合は、バッテリーの消耗など、繰り返しスキャンするだけです)

@Override
public void onResume() {
    super.onResume();
    //Note: Not using RSSI_CHANGED_ACTION because it never calls me back.
    IntentFilter rssiFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
    this.registerReceiver(myRssiChangeReceiver, rssiFilter);

    WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE);
    wifiMan.startScan();
}


    @Override
public void onPause() {
    super.onPause();
    this.unregisterReceiver(myRssiChangeReceiver);

}
/**
 * Broadcast receiver to update 
 */
private BroadcastReceiver myRssiChangeReceiver
        = new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        WifiManager wifiMan=(WifiManager)getActivity().getSystemService(Context.WIFI_SERVICE);
        wifiMan.startScan();
        int newRssi = wifiMan.getConnectionInfo().getRssi();
        Toast.makeText(getActivity(), ""+newRssi, Toast.LENGTH_SHORT).show();

}};

申し訳ありませんが、私はあなたの問題を解決しなければならなかったことを知りました:P

于 2012-07-11T19:01:56.733 に答える
0

RSSI レベルが変化すると、WifiManager.RSSI_CHANGED_ACTION がトリガーされます。つまり、wifi バーを失うか、または獲得します。それほど頻繁には起こりません。私の推測では、粘着性があるため、登録時にトリガーされます。

前述のように、問題を解決するために私が見つけた最良の方法は、 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION を使用することです。

于 2015-02-12T20:20:14.753 に答える
-1

トリガーする必要があることを確認していますか(つまり、信号強度が変化していることを確認していますか)?BroadcastRecieverのドキュメントを読みましたか?

注: Activity.onResume() 実装でレシーバーを登録する場合は、Activity.onPause() で登録を解除する必要があります。(一時停止するとインテントを受信しなくなり、不要なシステム オーバーヘッドが削減されます)。Activity.onSaveInstanceState() で登録解除しないでください。これは、ユーザーが履歴スタックに戻ると呼び出されないためです。

AndroidManifest 内でレシーバーを登録してみてください。

于 2012-01-03T22:06:33.747 に答える