Android GPS местоположение не точное - PullRequest
0 голосов
/ 29 ноября 2018

У меня проблема с разрабатываемым приложением для Android.Приложение запускает таймер обратного отсчета и отправляет текстовое сообщение, когда таймер достигает нуля.Через 9 секунд приложение должно получить местоположение телефона.Когда таймер достигает нуля, он отправляет местоположение (полученное за 9 секунд) в качестве ссылки на карту в текстовом сообщении.

Приложение работает, но местоположение GPS, которое оно отправляет, иногда находится на расстоянии более 100 метров.Мне нужно, чтобы приложение было максимально точным.У меня есть версия, использующая платформу android.location, и версия, использующая fusedlocationapi.Версия android.location, которую я имею, намного более точна, чем fusedlocationapi, что очень меня смущает.

Что меня действительно беспокоит, так это то, что: если я запускаю таймер и получаю неточное местоположение, я могу открыть карты Google (которые покажут очень точное местоположение), вернуться в свое приложение, запуститьтаймер снова, и я получу точное местоположение (аналогично тому, что карты Google только что показали мне).Карты Google используют лучший способ узнать мое местоположение или мой код просто плох?Я думал, что приложение будет показывать то же местоположение, что и карты Google, но это не так, и это очень расстраивает меня.Любые мысли по этому поводу будет принята с благодарностью.

Вот мой код, куда я добавляю fusedlocationapi:

  /**
     * Creating google api client object
     * */

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API).build();

        mGoogleApiClient.connect();

        LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(5000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

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

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult locationSettingsResult) {

                final Status status = locationSettingsResult.getStatus();

                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location requests here
                        getLocation();
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(SafetyAlarmActivity.this, REQUEST_CHECK_SETTINGS);

                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        break;
                }
            }
        });


    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        getLocation();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        break;
                    default:
                        break;
                }
                break;
        }
    }


    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.e(TAG, " mGoogleApiClient Connection connected:");

        getLocation();

    }

    @Override
    public void onConnectionSuspended(int i) {
        mGoogleApiClient.connect();

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

        Log.e(TAG, "Connection failed: ConnectionResult.getErrorCode() = "+ connectionResult.getErrorCode());


    }

Вот код, где приложение получает местоположение за 9 секунд:

    /*
    update GPS location
     */

    private void updateGPSLocation(long millisUntilFinished) {

        Log.e("current time remaining", " time: "+millisUntilFinished/1000);


        if(millisUntilFinished/1000==9)
        {

            Log.e("9 seconds remaining", "get locaiton");

            getLocation();
        }
    }

     /*
  get location
   */

    private void getLocation()
    {

        try
        {
            Location lastLocation = LocationServices.FusedLocationApi
                    .getLastLocation(mGoogleApiClient);

            PersistObject.apply(con,AppConstant.LOCATION,lastLocation);

        }
        catch (SecurityException e)
        {
            e.printStackTrace();
        }


    }

Вотмои разрешения:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...