BroadcastReceiver, объявленный в манифесте, не получает Broadcast - PullRequest
13 голосов
/ 24 февраля 2012

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

<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 в манифесте?

Я не хочу регистрировать это в действиях , потому что я хочу отслеживать Wi-Fi , когда есть изменения в состоянии Wi-Fi, независимо от того, запущено мое приложение или нет. *

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

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

Ответы [ 7 ]

26 голосов
/ 24 февраля 2012

Ваш приемник в манифесте должен выглядеть следующим образом

<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" />
3 голосов
/ 24 февраля 2012
<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

2 голосов
/ 03 июня 2019

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

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

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

0 голосов
/ 12 июля 2017

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

<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" />
0 голосов
/ 25 марта 2014

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

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"/>
0 голосов
/ 24 февраля 2012

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

<receiver
    android:name=".WiFiReciever">
    <intent-filter>
        <action
            android:name="class name with package" />
        <data
            android:scheme="myscheme" />
    </intent-filter>
</receiver> 
0 голосов
/ 24 февраля 2012

То, что трансляция была отправлена ​​с флагом Intent.FLAG_RECEIVER_R номен

...