I've tried to register a Wifi BroadcastReceiver to get the wifi state when it changes. But so far I have no luck receiving the broadcast.
<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>
Do you guys know how to register the BraodcastReceiver in manifest?
I don't want to register it in activities because I want to monitor the wifi when there is changes in the wifi state whether my application is running or not.
This is my BroadcastReceiver class:
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());
}
}
I really hope to get some help. Thanks in advance.
Your receiver in manifest should looks like this
<receiver android:name=".WifiReceiver" >
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
Also the following permission may be needed
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<receiver android:name=".WifiReceiver" >
<intent-filter android:priority="100" >
<action
android:name="android.net.wifi.WIFI_STATE_CHANGED"
android:enabled="true" />
</intent-filter>
</receiver>
Enter the high priority and also enabled flag as true
If your Target android version is more than Android O. if you declare receivers in manifest they wont work. So you need to register inside your activity.
Note: If your app targets API level 26 or higher, you cannot use the manifest to declare a receiver for implicit broadcasts (broadcasts that do not target your app specifically), except for a few implicit broadcasts that are exempted from that restriction. In most cases, you can use scheduled jobs instead.
Resource: https://developer.android.com/guide/components/broadcasts
Just because the broadcast was send with flag Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, it means, your app must register this receiver before android boot up, which can only be the system services.
I think you have registered the receiver like this way:
<receiver
android:name=".WiFiReciever">
<intent-filter>
<action
android:name="class name with package" />
<data
android:scheme="myscheme" />
</intent-filter>
</receiver>
The best that worked for me:
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 Class:
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();
}
}
}
}
Permissions:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
This is all broadcast receiver related to the internet connection
<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" />
来源:https://stackoverflow.com/questions/9425187/broadcastreceiver-declared-in-manifest-is-not-receiving-the-broadcast