OnStatusChanged de Android10 LocationListener está abandonado

  OnStatusChanged de LocationListener está obsoleto en Android10, esta devolución de llamada nunca se llama en Android Q y versiones posteriores, se puede considerar que el proveedor siempre está en el estado LocationProvider#AVAILABLE.

UbicaciónListener | Desarrolladores de Android

Existen las siguientes soluciones:

① Utilice LocationListenerCompat (el dispositivo debe estar equipado con GMS)

② Utilice Amap SDK, Baidu SDK o un tercero

Sin embargo, en algunos proyectos estas condiciones no se cumplen, lo que lleva al abandono de la API. En lugares donde la señal GPS no es buena, no hay forma de volver a llamar para avisar a la aplicación que la señal GPS no es buena y realice el procesamiento lógico de la respuesta. Este artículo se centra en resolver este problema.

1. Cree una interfaz para solicitar ubicación

public interface LocationChangeListener {
    void onLocationChanged(double latitude, double longitude);
    default void onProviderEnabled(String provider) {}
    default void onProviderDisabled(String provider) {}
    default void onStatusChanged(String provider, int status, Bundle extras) {}
}

2. Crear GpsLocationManager

public class GpsLocationManager {

    private static final String TAG = GpsLocationManager.class.getSimpleName();

    private final LocationManager mLocationManager;
    private LocationChangeListener mLocationChangeListener;
    private LocationChangedListener mLocationChangedListener;
    public static SpUtils mGPSSpUtils = null;

    public void setLocationChangeListener(LocationChangeListener listener) {
        this.mLocationChangeListener = listener;
    }

    public GpsLocationManager() {
        mLocationManager = (LocationManager) App.get().getSystemService(Context.LOCATION_SERVICE);
        mLocationChangedListener = new LocationChangedListener();
        mGPSSpUtils = new SpUtils(App.get(), Const.GPS_STATE_SP);
    }

    /**
     * request location.
     *
     * @param context          context
     */
    public void requestLocationUpdates(Context context) {
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // 如果没有位置权限,请求用户授权
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        } else {
            // 如果有位置权限,开始监听位置变化
            mLocationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,mLocationChangedListener, Looper.getMainLooper());
            mGPSSpUtils.setBoolean(Const.GPS_STATE_SP, false);
            mGPSSpUtils.apply();
        }
    }

    /**
     * release LocationManager.
     *
     */
    public void release() {
        if (mLocationManager != null && mLocationChangedListener != null) {
            try {
                mLocationManager.removeUpdates(mLocationChangedListener);
            } catch (SecurityException e) {
                Logger.e(TAG, "Error releasing location updates: " + e.getMessage());
            }
        }
    }

    public class LocationChangedListener implements LocationListener {

        public LocationChangedListener() {
        }

        @Override
        public void onLocationChanged(Location location) {
            mGPSSpUtils.setBoolean(Const.GPS_STATE_SP, true);
            mGPSSpUtils.apply();
            if (mLocationChangeListener != null) {
                mLocationChangeListener.onLocationChanged(location.getLatitude(), location.getLongitude());
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            if (mLocationChangeListener != null) {
                mLocationChangeListener.onStatusChanged(provider, status, extras);
            }
        }

        @Override
        public void onProviderEnabled(String provider) {
            mGPSSpUtils.setBoolean(Const.GPS_STATE_SP, true);
            mGPSSpUtils.apply();
            if (mLocationChangeListener != null) {
                mLocationChangeListener.onProviderEnabled(provider);
            }
        }

        @Override
        public void onProviderDisabled(String provider) {
            mGPSSpUtils.setBoolean(Const.GPS_STATE_SP, false);
            mGPSSpUtils.apply();
            if (mLocationChangeListener != null) {
                mLocationChangeListener.onProviderDisabled(provider);
            }
        }
    }
}

SharedPreferences se utiliza para almacenar el estado de emisión de solicitudes de ubicación y solicitud de información de ubicación.

3. Llame al método en el administrador para solicitar datos donde el proyecto lo requiera.

    private static void requestLocationAndDataUpdates() {
        mGpsLocationManager.setLocationChangeListener(new LocationChangeListener() {
            @Override
            public void onLocationChanged(double latitude, double longitude) {
                Logger.d(TAG, "onLocationChanged: latitude:" + latitude + " longitude:"+ longitude);
                // 请求到位置信息,进行相应的操作
            }
        });

        // 请求位置更新
        mGpsLocationManager.requestLocationUpdates(mContext);
    }

En el momento adecuado, retrase la adquisición del valor de SharedPreferences para determinar si se solicita información de ubicación.

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    boolean GpsMsgState = mGPSSpUtils.getBoolean(Const.GPS_STATE_SP,false);
                    Logger.d(TAG, "checkNetworkAndRequestLocation: GpsMsgState:"+GpsMsgState);
                    if (!GpsMsgState) {
                        mWeatherInfo.setGPSState(Const.GPS_INVALID);
                        // 没有请求到位置信息,进行相应的操作
                    }
                }
            }, Const.RQUEST_STATE_DELAYED_TIME);

Aquí defino Const.RQUEST_STATE_DELAYED_TIME como 6 segundos. Generalmente, el tiempo que lleva solicitar información de ubicación es de unos pocos segundos a decenas de segundos y se puede ajustar de acuerdo con proyectos específicos.

   Por supuesto, sería mejor si el proyecto estuviera equipado con un SDK de terceros. Este es un último recurso y tiene desventajas: si el GPS está fuera del tiempo de retardo personalizado, no se puede obtener la información de ubicación (también puede escribir un programa para monitorear los cambios en longitud y latitud), monitoreo), si encuentra este problema, puede consultarlo.

Supongo que te gusta

Origin blog.csdn.net/m0_50408097/article/details/133385439
Recomendado
Clasificación