Android LocationListener - 在 onProviderDisabled / onProviderEnabled 中无法检测到 Wifi

Android LocationListener - Can't detect Wifi in onProviderDisabled / onProviderEnabled

我有一项服务对 GPS 和网络提供商都使用 LocationListeners。

当我在 phone 上禁用或启用 GPS 时,GPS 侦听器会检测到,但网络 (Wifi) 侦听器不会检测到 wifi off/on。 下面是我处理 GPS 和网络的监听器的代码。我不明白为什么我只能在 onProviderEnabled/onProviderDisabled.

中得到 "gps"

我是不是漏掉了什么?

@Override
public void onLocationChanged(Location location) {

if (Double.parseDouble(String.valueOf(location.getAccuracy())) > noiseAllowance) {

    return;

}

if (provider.equals(LocationManager.GPS_PROVIDER)) {

    gotPositionFromGps();

}

changeNotificationText(location);

processNewLocation(location);

}

@Override
public void onProviderDisabled(String provider) {

//Here, when I disable Wifi on my phone, provider never returns wifi

if (new CheckAvailableProviders().checkGps(context))

    return;

cleanResources();

}

@Override
public void onProviderEnabled(String provider) {

//Here, when I enable Wifi on my phone, provider never returns wifi

if (this.provider.equals(LocationManager.GPS_PROVIDER)
        && provider.equals(LocationManager.NETWORK_PROVIDER)
        && canEnableNetworkListener > 0) {

    service.getLocationFromNetwork(60 * 1000, 15);

  }
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

private void cleanResources() {

stopService();

clearVariables();

}

private void clearVariables() {

try {
    countDown.cancel();
} catch (Exception e) {
}

countDown = null;

builder = null;

calculateHome = null;

context = null;

manageNotifications = null;

provider = null;

service = null;

}

private void stopService() {

Intent sendIntent = new Intent();

sendIntent.setAction("com.location.home.device.STOPPED_GETTING_LOCATION");

context.sendBroadcast(sendIntent);

 context.stopService(new Intent(context, GpsService.class));

}

private void changeNotificationText(Location location) {

DecimalFormat precision = new DecimalFormat("0.000");

double lat = location.getLatitude();
double lon = location.getLongitude();

builder.setContentText(
        context.getResources().getString(R.string.notification_text) +
                String.valueOf(precision.format(lat)) +
                " N " +
                String.valueOf(precision.format(lon)) +
                " E");

manageNotifications.notify(1, builder.build());

}

private void gotPositionFromGps() {

restartCountDown();

canEnableNetworkListener = 0;

service.removeListenerUpdates(1);

}

清单权限:

<uses-permission android:name="android.hardware.location.gps"/>

<uses-permission android:name="android.hardware.location.network"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

根据 documentation:

This provider determines location based on availability of cell tower and WiFi access points.

因此,如果可以访问蜂窝网络,则不需要 Wi-Fi,因此仅通过关闭 Wi-Fi 可能不会禁用提供商。