启用 wifi 且 WifiManager.EXTRA_WIFI_STATE 不可用时,android.net.wifi.STATE_CHANGE 不广播

标签 android android-intent broadcastreceiver wifimanager

list :

<receiver android:name=".triggers.WifiTrigger">
        <intent-filter>
            <action android:name="android.net.wifi.STATE_CHANGE" />
        </intent-filter>
    </receiver>

权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

接收器在 WiFi 禁用、连接或断开时执行(未检查连接/禁用/启用)但在 WiFi 启用时不触发,此外 WifiManager.EXTRA_WIFI_STATE extra Intent 不可用,我正在使用这个:

public class WifiTrigger extends BroadcastReceiver {
    ...
    @Override
public void onReceive(Context context, Intent intent) {
    SharedPreferences preferences= PreferenceManager.getDefaultSharedPreferences(context);

    int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
    int previousWifiState = intent.getIntExtra(WifiManager.EXTRA_PREVIOUS_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
    log("p"+previousWifiState);
    log("c"+wifiState);
    //log is a defined method used for logging (it just calls Log.d(...,...)
    }
    ...
}

它会一直记录 p4 c4(WifiManager.WIFI_STATE_UNKNOWN 为 4)


最佳答案

您正在注册错误的 Intent 操作。您真正要寻找的是:

/**
 * Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
 * enabling, disabling, or unknown. One extra provides this state as an int.
 * Another extra provides the previous state, if available.
 *
 * @see #EXTRA_WIFI_STATE
 * @see #EXTRA_PREVIOUS_WIFI_STATE
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_STATE_CHANGED_ACTION =
    "android.net.wifi.WIFI_STATE_CHANGED";

您注册的操作是针对网络状态更改,而不是适配器状态更改:

/**
 * Broadcast intent action indicating that the state of Wi-Fi connectivity
 * has changed. One extra provides the new state
 * in the form of a {@link android.net.NetworkInfo} object. If the new
 * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of
 * the access point.
 * as a {@code String}.
 * @see #EXTRA_NETWORK_INFO
 * @see #EXTRA_BSSID
 * @see #EXTRA_WIFI_INFO
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String NETWORK_STATE_CHANGED_ACTION = 
    "android.net.wifi.STATE_CHANGE";

所以只需更改您的接收器注册:

<receiver android:name=".triggers.WifiTrigger">
    <intent-filter>
        <action android:name="android.net.wifi.STATE_CHANGE" />
    </intent-filter>
</receiver>

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

将解决您的问题。

关于启用 wifi 且 WifiManager.EXTRA_WIFI_STATE 不可用时,android.net.wifi.STATE_CHANGE 不广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39377642/

相关文章:

Android:将变量从 Activity 传递到 BroadcastReceiver

Android 在应用程序中保存登录用户详细信息

android - 缩放后获取drawable显示大小

android - 动态创建的 BroadcastReceiver 生命周期

Android 应用在点击通知时启动缓慢

android - 从通知启动应用程序将其从最近的应用程序历史记录中删除

android - 处理传入消息我的 broadCastReceiver 不工作

android - 在运行时查找是否已使用应用程序编译了库

android - 在两次抽奖之间暂停

android - 从通知中发送 ACTION_SEND Intent