2011-07-06 80 views
6

我的應用的部分功能是掃描並顯示WiFi接入點列表,然後連接到用戶選擇的接入點。我有這個功能工作。現在,我也希望在連接「通過」時得到通知。這應該相當簡單,但我發現自己絆倒了。WIFI_STATE_CHANGED_ACTION意圖在連接到WiFi接入點時未收到?

我已閱讀了SO的各種帖子,他們都提到註冊WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTIONWifiManager.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的無線網絡設置屏幕中的地位。

回答

19

確定後得到廣播,我想通了。原來我註冊了錯誤的意圖。我應該使用 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(); 
    } 
} 
-1

要狀況正在發生變化看this

+2

您鏈接到顯示如何文章在掃描結果可用時接收廣播。我的應用程序已經成功地做到了。我需要的是一旦接入點的WiFi連接成功就立即獲得廣播。我在文章中沒有看到與此相關的任何內容。 – curioustechizen

0

我可以添加這些權限後,檢測到表現來檢測廣播:

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>