2012-02-24 4 views
10

Ho provato a registrare un BroadcastReceiver Wifi per ottenere lo stato wifi quando cambia. Ma finora non ho avuto fortuna a ricevere la trasmissione.BroadcastReceiver dichiarato in manifest non riceve la trasmissione

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

Ragazzi, sapete come registrare il BraodcastReceiver in manifest?

Non voglio registrarlo in attività perché voglio monitorare il wifi quando c'è cambiamenti nello stato wifi se la mia applicazione è in esecuzione o meno.

Questa è la mia classe BroadcastReceiver:

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

spero davvero di avere un aiuto. Grazie in anticipo.

+0

Guardate questo Blog http://marakana.com/forums/android/examples/40.html – Ajay

+0

Avete definito il permesso per Android .permission.ACCESS_WIFI_STATE e android.permission.CHANGE_WIFI_STATE – Ajay

+0

@Ajay, ho già guardato quel blog che hai menzionato. Il problema è che, come ho detto, voglio registrare il ricevitore nel manifest NON nelle attività. Ho già inserito il permesso nel manifest. Ad ogni modo, grazie per l'attenzione Ajay. – Zul

risposta

25

Il ricevitore a manifestare dovrebbe apparire come questo

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

Anche la seguente autorizzazione può essere necessaria

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

Wow..thanks @ dong221.Questo è stato davvero. Se non ti dispiace che ti chieda, come facevi a sapere che il nome dell'azione deve essere "android.net.wifi.WIFI_STATE_CHANGED"? puoi darmi qualche link su questo? – Zul

+1

@Zul È elencato qui come valore costante: http://developer.android.com/reference/android/net/wifi/WifiManager.html#WIFI_STATE_CHANGED_ACTION –

0

Solo perché la trasmissione è stata inviata con flag Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, significa che l'app deve registrare questo ricevitore prima dell'avvio di Android, che può essere solo i servizi di sistema.

0

penso che aver registrato il ricevitore come questo senso:

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

'', non ti sto seguendo. Qualche esempio su questo? – 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> 

Immettere t ha la massima priorità e la bandiera anche permesso come vero

+0

Wow..thanks @ user1203673. Questo è stato davvero. Se non ti dispiace che ti chieda, come facevi a sapere che il nome dell'azione deve essere "android.net.wifi.WIFI_STATE_CHANGED"? puoi darmi qualche link su questo? Mi dispiace di non poter votare, la mia reputazione non è sufficiente. L'attributo "abilitato" – Zul

+0

dà errore di sintassi. – usman

+0

Prova questo: ' ' –

0

Il meglio che ha funzionato per me:

manifesto:

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

WifiReceiver Classe:

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

Permessi:

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

Questo è tutto di trasmissione del ricevitore relative alla connessione 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" />