FusedLocationProviderClient не может получить местоположение GPS по сети 3G или 4G, если сначала не подключен к сети WIFI - PullRequest
1 голос
/ 01 октября 2019

Одно из наших приложений работает на Sunmi T1 и T2 mini. Приложение отправляет обратно данные о местоположении устройства, используя класс LocationUtil ниже:

 public class LocationUtil
 {

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

    private final long UPDATE_INTERVAL_IN_MILLISECONDS = 20000;
    private final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
    private final int REQUEST_CHECK_SETTINGS = 100;

    private FusedLocationProviderClient mFusedLocationClient;
    private SettingsClient mSettingsClient;
    private LocationRequest mLocationRequest;
    private LocationSettingsRequest mLocationSettingsRequest;
    private LocationCallback mLocationCallback;
    private Location mCurrentLocation;
    private LocationReceived locReceiveListener;

    private boolean gettingUpdatesStarted;

    private Context context;

    public LocationUtil(){

    }

    public LocationUtil(Context context)
    {
        this.context = context;
    }

    public interface LocationReceived {
        void onReceive(Location location);
        void onError(String message);
    }

    private Activity actContext = null;

    public void initialise(Activity context) {

        this.actContext = context;

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context);

        mSettingsClient = LocationServices.getSettingsClient(context);

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);
        mLocationSettingsRequest = builder.build();

        if (mLocationCallback == null)
        {
            mLocationCallback = new LocationCallback()
            {
                @Override
                public void onLocationResult(LocationResult locationResult)
                {
                    super.onLocationResult(locationResult);
                    // location is received
                    mCurrentLocation = locationResult.getLastLocation();
                    locReceiveListener.onReceive(mCurrentLocation);
                }

                @Override
                public void onLocationAvailability(LocationAvailability locationAvailability)
                {
                    super.onLocationAvailability(locationAvailability);
                }
            };
        }
    }

    public void StartLocationUpdater(LocationReceived locReceiveListenerIn){

        locReceiveListener = locReceiveListenerIn;

        if (!gettingUpdatesStarted)
        {    
            gettingUpdatesStarted = true;

            mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
                .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>()
                {
                    @SuppressLint("MissingPermission")
                    @Override
                    public void onSuccess(LocationSettingsResponse locationSettingsResponse)
                    {
                        Log.i(TAG, "All location settings are satisfied.");

                        mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback, Looper.myLooper());

                    }
                })
                .addOnFailureListener(new OnFailureListener()
                {
                    @Override
                    public void onFailure(@NonNull Exception e)
                    {
                        int statusCode = ((ApiException) e).getStatusCode();
                        gettingUpdatesStarted = false;
                        switch (statusCode)
                        {
                            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
                                        "location settings ");
                                try {
                                    // Show the dialog by calling startResolutionForResult(), and check the
                                    // result in onActivityResult().
                                    ResolvableApiException rae = (ResolvableApiException) e;
                                    rae.startResolutionForResult((Activity) actContext, REQUEST_CHECK_SETTINGS);
                                } catch (IntentSender.SendIntentException sie) {
                                    Log.i(TAG, "PendingIntent unable to execute request.");
                                }
                                break;
                            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                String errorMessage = "Location settings are inadequate, and cannot be " +
                                        "fixed here. Fix in Settings.";
                                Log.e(TAG, errorMessage);
                        }

                    }

                });
        }
    }


    public void getLastLocation(LocationReceived locReceiveListenerIn) {

        locReceiveListener = locReceiveListenerIn;

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context);

        mFusedLocationClient.getLastLocation()
            .addOnSuccessListener( new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // Got last known location. In some rare situations this can be null.
                    if (location != null) {

                        mCurrentLocation = location;
                        locReceiveListener.onReceive(mCurrentLocation);
                    }
                    else{
                        locReceiveListener.onError("No location received");
                    }
                }

            });

    }

    public void stopLocationUpdates() {
        // Removing location updates
        mFusedLocationClient
            .removeLocationUpdates(mLocationCallback)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                    gettingUpdatesStarted = false;

                }
            });
    }
}

Однако, похоже, что приложение получает данные о местоположении только тогда, когда устройство сначала подключено к WIFI, а затем переключено обратно на 3G и 4G. ,Устройство не отправляет данные о местоположении, когда оно впервые подключено к сети 3G или 4G. При тестировании было обнаружено следующее:

В результате начальное позиционирование с 3G может быть успешным, но только медленно. В коде использовалась схема позиционирования слияния GMS. Когда устройство запрашивает информацию о местоположении путем регистрации, устройство вскоре получает информацию о местоположении базовой станции. GMS использовала информацию о местоположении базовой станции для анализа долготы и широты устройства. Но через три минуты процесс GMS печатает журнал без местоположения, а ваше приложение по-прежнему не имеет информации о местонахождении. Но через некоторое время приложение смогло получить информацию из сети 4G. Исходя из имеющейся в настоящее время информации, есть подозрение, что существует проблема с GMS, возвращающей местоположение в приложение

Даже при использовании последних сервисов Google Play местоположение не может быть предоставлено

1 Ответ

0 голосов
/ 16 октября 2019

Дальнейшие исследования показали, что первая проблема заключалась в том, что устройство имело устаревшую версию сервисов Google Play. Причина, по которой сервисы Google Play не обновлялись, была из-за ограничений сима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...