web-dev-qa-db-fra.com

BroadcastReceiver déclaré dans le manifeste ne reçoit pas la diffusion

J'ai essayé d'enregistrer un Wifi BroadcastReceiver pour obtenir l'état Wi-Fi quand il change. Mais jusqu'à présent, je n'ai aucune chance de recevoir l'émission.

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

Savez-vous comment enregistrer BraodcastReceiver dans le manifeste?

Je ne veux pas l'enregistrer dans les activités parce que je veux surveiller le wifi lorsque l'état du wifi change, indique si mon application est en cours d'exécution ou non.

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

J'espère vraiment avoir de l'aide. Merci d'avance.

12
Zul

Votre destinataire dans le manifeste devrait ressembler à ceci

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

De plus, l'autorisation suivante peut être nécessaire

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
25
dong221
<receiver Android:name=".WifiReceiver" >
     <intent-filter Android:priority="100" >
          <action
             Android:name="Android.net.wifi.WIFI_STATE_CHANGED"
             Android:enabled="true" />
     </intent-filter>
</receiver>

Entrez l'indicateur de priorité élevée et activé en tant que true

3
user1203673

Ce n’est pas parce que la diffusion a été envoyée avec le drapeau Intent.FLAG_RECEIVER_REGTED_ONLY_BEFORE_BOOT que votre application doit enregistrer ce récepteur avant le démarrage d’Android, qui ne peut être que les services système.

0
Cytown

Le meilleur qui a fonctionné pour moi:

Manifeste:

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

Autorisations:

<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
0
M. Usman Khan

Je pense que vous avez enregistré le récepteur de la manière suivante:

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