7

私のアプリの機能の一部は、WiFiアクセスポイントのリストをスキャンして表示し、ユーザーが選択したものに接続することです。この機能を使用しています。さて、接続が「通過」したときにも通知を受け取りたいと思います。これはかなり単純なはずですが、私はつまずきます。

WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION私はここSOでさまざまな投稿を読みましたが、それらはすべてまたはに登録することについて言及していますWifiManager.WIFI_STATE_CHANGED_ACTION。しかし、これらはどちらも私にはうまくいきません。誰かがこのコードの間違いを見つけることができますか?(スキャンなどを行う部分は省略しています)

予想される動作:接続が成功するとすぐに(つまり、通知バーに「接続済み」アイコンが表示されたら)、ブロードキャストが受信され、トーストが表示されます。

観察された動作:ブロードキャストは、アプリが最初に起動したとき、およびアプリに戻ったとき(つまり、onResume()呼び出されたとき、またはインテントに登録したときはいつでも)に

public class WifiScanActivity extends Activity {

    WifiManager mainWifi;
    WifiReceiver mWifiReceiver;
    IntentFilter mIntentFilter;
    private final static String TAG = "WifiScanActivity";
    public static final String INTENT_FOR_WIFI_CONNECTED =
            WifiManager.WIFI_STATE_CHANGED_ACTION;
    // public static final String INTENT_FOR_WIFI_CONNECTED =
    // WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        mWifiReceiver = new WifiReceiver();
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        mIntentFilter.addAction(INTENT_FOR_WIFI_CONNECTED);
        registerReceiver(mWifiReceiver, mIntentFilter);
        mainWifi.startScan();
    }

    protected void onPause() {
        unregisterReceiver(mWifiReceiver);
        super.onPause();
    }

    protected void onResume() {
        registerReceiver(mWifiReceiver, mIntentFilter);
        super.onResume();
    }

    class WifiReceiver extends BroadcastReceiver {

        public void onReceive(Context c, Intent intent) {
            Log.d(TAG,
                "In WifiReceiver: Broadcast Received = " + intent.getAction());
            if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent
                .getAction())) {
                // Display the ListView and connect to the selected AP
            } else if (INTENT_FOR_WIFI_CONNECTED.equals(intent.getAction())) {
                if (WifiManager.WIFI_STATE_ENABLED == intent.getIntExtra(
                    WifiManager.EXTRA_WIFI_STATE, 0)) {
                    displayNetworkInfo();
                }
                /*if(true == intent.getBooleanExtra(
                 * WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)){
                 *  displayNetworkInfo();
                }*/
            }
        }
    }

    private void displayNetworkInfo() {
        WifiInfo wifiInfo = mainWifi.getConnectionInfo();
        String ssid = wifiInfo.getSSID();
        int ip = wifiInfo.getIpAddress();
        String message = "Connection established.\nSSID = " + ssid
            + "; IP Address = " + Helper.displayIpAddress(ip);
        Log.d(TAG, message);
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTIONのコードのコメントを外すと、ブロードキャストがまったく受信されていないことがわかります。

:Androidのwifi設定画面にステータスが表示されるため、接続が成功したことはわかっています。

4

3 に答える 3

23

わかりました、わかりました。間違った意図で登録していたことがわかりました。を使用する必要があります WifiManager.NETWORK_STATE_CHANGED_ACTION

コードの関連部分のスニペットは次のとおりです。

mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) ;
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);


public void onReceive(Context c, Intent intent) {

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {

    NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
    if(NetworkInfo.State.CONNECTED.equals(nwInfo.getState())){//This implies the WiFi connection is through
        displayNetworkInfo();
    }
}
于 2011-07-19T01:54:27.390 に答える
0

ブロードキャストを検出するためにマニフェストにこれらの権限を追加した後、検出することができました。

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 
于 2016-12-22T07:31:31.443 に答える
-1

ステータスが変更された後にブロードキャストを取得するには、これを参照してください

于 2011-07-06T11:49:56.370 に答える