2012-02-24 85 views
10

我试图注册一个Wifi BroadcastReceiver,以便在更改时获取wifi状态。但到目前为止,我没有收到广播的运气。清单中声明的​​BroadcastReceiver未收到广播

<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> 

你们知道如何在清单中注册BraodcastReceiver吗?

我并不想注册活动,因为我想监控无线时候有我的应用程序是否运行,或者是wifi的状态变化。

这是我的广播接收器类:

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()); 
    } 
} 

我真的希望能得到一些帮助。提前致谢。

+0

看这个博客http://marakana.com/forums/android/examples/40.html – Ajay 2012-02-24 04:34:18

+0

你有没有为Android定义权限的所有广播接收器.permission.ACCESS_WIFI_STATE和android.permission.CHANGE_WIFI_STATE – Ajay 2012-02-24 04:36:38

+0

@Ajay,我已经看过你提到的博客。问题就像我刚才提到的那样,我想在清单中注册接收者而不是在活动中。我已经在清单中放入了许可。无论如何,谢谢你的关注Ajay。 – Zul 2012-02-24 07:00:10

回答

25

你的清单中接收机应该看起来像这样

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

也可能需要以下权限

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

哇..感谢@ dong221。这真的做到了。如果你不介意我问,你怎么知道这个动作名称必须是'android.net.wifi.WIFI_STATE_CHANGED'?你能给我任何链接吗? – Zul 2012-02-24 07:18:00

+1

@Zul它在这里被列为一个常数值:http://developer.android.com/reference/android/net/wifi/WifiManager.html#WIFI_STATE_CHANGED_ACTION – 2014-09-15 08:14:21

0

仅仅因为广播是用标志Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT发送的,这意味着你的应用程序必须在android启动之前注册这个接收器,它只能是系统服务。

0

我想你已经注册的接收器就像这样:

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

'',我没跟着你。这方面的例子? – Zul 2012-02-24 07:06:16

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> 

输入t他高度重视,也使标志为真

+0

哇..感谢@ user1203673。这真的做到了。如果你不介意我问,你怎么知道这个动作名称必须是'android.net.wifi.WIFI_STATE_CHANGED'?你能给我任何链接吗?对不起,我不能投票,我的名誉还不够。 – Zul 2012-02-24 07:21:00

+0

属性“enabled”给出语法错误。 – usman 2014-03-24 13:04:37

+0

试试这个: ' – 2016-11-24 19:08:15

0

为我工作的最好的:

清单:

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

WifiReceiver类:

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();  
      } 
     } 
    } 
} 

权限:

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

这是与互联网连接

<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" />