2012-02-24 28 views
10

Tôi đã cố gắng đăng ký một BroadcastReceiver Wifi để nhận trạng thái wifi khi nó thay đổi. Nhưng cho đến nay tôi không có may mắn nhận được phát sóng.BroadcastReceiver được khai báo trong tệp kê khai không nhận được Broadcast

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <receiver android:name=".WifiReceiver" > 
     <intent-filter> 
      <action android:name="android.net.wifi.WifiManager.WIFI_STATE_CHANGED_ACTION" /> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

    //activity declaration here... 

</application> 

Các bạn có biết cách đăng ký BraodcastReceiver trong tệp kê khai không?

Tôi không muốn đăng ký nó trong hoạt động vì tôi muốn giám sát wifi khi có những thay đổi trong tình trạng wifi cho dù ứng dụng của tôi đang chạy hay không.

Đây là lớp BroadcastReceiver tôi:

public class WifiReceiver extends BroadcastReceiver { 
    private final String TAG = "WifiReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); 
     String wifiStateText = "No State"; 

     switch (wifiState) { 
     case WifiManager.WIFI_STATE_DISABLING: 
      wifiStateText = "WIFI_STATE_DISABLING"; 
      break; 
     case WifiManager.WIFI_STATE_DISABLED: 
      wifiStateText = "WIFI_STATE_DISABLED"; 
      break; 
     case WifiManager.WIFI_STATE_ENABLING: 
      wifiStateText = "WIFI_STATE_ENABLING"; 
      break; 
     case WifiManager.WIFI_STATE_ENABLED: 
      wifiStateText = "WIFI_STATE_ENABLED"; 
      break; 
     case WifiManager.WIFI_STATE_UNKNOWN: 
      wifiStateText = "WIFI_STATE_UNKNOWN"; 
      break; 
     default: 
      break; 
     } 
     MyLog.d(TAG, "onReceive Broadcast > WiFiState: " + wifiStateText); 
     MyLog.d(TAG, "onReceive Broadcast > Time: " + new Date()); 
    } 
} 

Tôi thực sự hy vọng sẽ nhận được một số giúp đỡ. Cảm ơn trước.

+0

Nhìn vào Blog này http://marakana.com/forums/android/examples/40.html – Ajay

+0

Bạn đã xác định phép cho android .permission.ACCESS_WIFI_STATE và android.permission.CHANGE_WIFI_STATE – Ajay

+0

@Ajay, tôi đã xem Blog mà bạn đã đề cập. Vấn đề là, như tôi đã đề cập, tôi muốn đăng ký người nhận trong bản kê khai KHÔNG trong các hoạt động. Tôi đã cho phép trong tệp kê khai. Dù sao, cảm ơn sự chú ý của bạn Ajay. – Zul

Trả lời

25

nhận của bạn trong manifest nên trông như thế này

<receiver android:name=".WifiReceiver" > 
    <intent-filter> 
     <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
    </intent-filter> 
</receiver> 

Ngoài sự cho phép sau đây có thể là cần thiết

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
+0

Wow..thanks @ dong221.Điều đó thực sự đã làm điều đó. Nếu bạn không nhớ tôi hỏi, làm cách nào bạn biết rằng tên hành động phải là 'android.net.wifi.WIFI_STATE_CHANGED'? bạn có thể cho tôi bất kỳ liên kết nào không? – Zul

+1

@Zul Được liệt kê ở đây dưới dạng giá trị không đổi: http://developer.android.com/reference/android/net/wifi/WifiManager.html#WIFI_STATE_CHANGED_ACTION –

0

Chỉ vì phát sóng được gửi kèm cờ Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, có nghĩa là ứng dụng của bạn phải đăng ký bộ thu này trước khi khởi động Android, chỉ có thể là dịch vụ hệ thống.

0

Tôi nghĩ rằng bạn đã đăng ký nhận như theo cách này:

<receiver 
    android:name=".WiFiReciever"> 
    <intent-filter> 
     <action 
      android:name="class name with package" /> 
     <data 
      android:scheme="myscheme" /> 
    </intent-filter> 
</receiver> 
+0

'', tôi không theo dõi bạn. Bất kỳ ví dụ về điều đó? – Zul

3
<receiver android:name=".WifiReceiver" > 
    <intent-filter android:priority="100" > 
      <action 
      android:name="android.net.wifi.WIFI_STATE_CHANGED" 
      android:enabled="true" /> 
    </intent-filter> 
</receiver> 

Nhập t ông ưu tiên cao và cũng có thể kích hoạt lá cờ là đúng

+0

Wow..thanks @ user1203673. Điều đó thực sự đã làm điều đó. Nếu bạn không nhớ tôi hỏi, làm cách nào bạn biết rằng tên hành động phải là 'android.net.wifi.WIFI_STATE_CHANGED'? bạn có thể cho tôi bất kỳ liên kết nào không? Tôi xin lỗi tôi không thể bỏ phiếu, danh tiếng của tôi là không đủ. – Zul

+0

thuộc tính "đã bật" cho lỗi cú pháp. – usman

+0

Hãy thử điều này: ' ' –

0

Điều tốt nhất mà làm việc cho tôi:

Manifest:

<receiver android:name="com.AEDesign.communication.WifiReceiver"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.net.wifi.STATE_CHANGE" /> 
    </intent-filter> 
</receiver> 

WifiReceiver Class:

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
     if(info != null) { 
      if(info.isConnected()) { 
       //Do your work. 
       //To check the Network Name or other info: 
       WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
       WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
       String ssid = wifiInfo.getSSID();  
      } 
     } 
    } 
} 

Quyền:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
-1

Đây là tất cả các máy thu phát sóng liên quan đến việc kết nối internet

<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />     
<action android:name="android.net.wifi.STATE_CHANGE" /> 
Các vấn đề liên quan