BroadcastReceiver, объявленный в манифесте, не получает трансляцию

Я попытался зарегистрировать Wifi BroadcastReceiver, чтобы получить состояние wifi, когда оно изменится. Но пока мне не повезло получить трансляцию.

<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, когда есть изменения в состоянии wifi, работает ли мое приложение или нет.

Это мой класс 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());
    }
}

Я действительно надеюсь получить помощь. Заранее спасибо.

Ответ 1

Ваш приемник в манифесте должен выглядеть так:

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

Ответ 2

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

Введите высокий приоритет, а флаг включен как true

Ответ 3

Просто потому, что трансляция была отправлена с флагом Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, это означает, что ваше приложение должно зарегистрировать этот ресивер перед загрузкой Android, что может быть только системными службами.

Ответ 4

Я думаю, что вы зарегистрировали приемник так:

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

Ответ 5

Лучшее, что сработало для меня:

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:

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

Ответ 6

Если ваша версия Android для Target больше, чем Android O. Если вы объявите получателей в манифесте, они не будут работать. Так что вам нужно зарегистрироваться в своей деятельности.

Примечание. Если ваше приложение предназначено для уровня API 26 или выше, вы не можете использовать манифест для объявления получателя для неявных широковещательных рассылок (широковещательных рассылок, которые не предназначены специально для вашего приложения), за исключением нескольких неявных широковещательных рассылок, которые освобождены от этого ограничения. В большинстве случаев вы можете использовать запланированные задания вместо.

Ресурс: https://developer.android.com/guide/components/broadcasts

Ответ 7

Это все широковещательный приемник, связанный с подключением к Интернету

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