Текущее местоположение имеет значение null в Android

Когда я выхожу на экран, я проверяю, включен ли GPS, если нет, отображается диалоговое окно для включения GPS. Когда пользователь нажимает «Да», onActivityResult -> GPS включается, и я пытаюсь получить местоположение, но это всегда возвращает ноль

Когда я выхожу на экран с уже включенным GPS, местоположение определяется правильно. Я боролся с этим в течение нескольких дней и не могу найти никаких ресурсов.

пожалуйста, помогите мне, что я сделал неправильно?

 @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.recyler_list, container, false);
        initializeView(view);
         registerGoogleClient()
        return view;

    }

    private void registerGoogleClient() {

     try {
                // Create an instance of GoogleAPIClient.
                if (mGoogleApiClient == null) {
                    mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                            .addConnectionCallbacks(this)
                            .addOnConnectionFailedListener(this)
                            .addApi(LocationServices.API)
                            .build();
                    LocationRequest locationRequest = LocationRequest.create();
                    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
                    builder.addLocationRequest(locationRequest);
                    builder.setAlwaysShow(true);
                    locationSettingsRequest = builder.build();
                    connectGoogleApiClient();
                }

            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

     @Override
        public void onStart() {
            super.onStart();

            try {
                connectGoogleApiClient();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

        private void connectGoogleApiClient() {
            try {
                if (mGoogleApiClient != null) {
                    mGoogleApiClient.connect();
                    checkDeviceGps();
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

      @Override
        public void onStop() {
            super.onStop();
            disConnectGoogleApiClient();
        }

     private void disConnectGoogleApiClient() {

            try {
                if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
                    mGoogleApiClient.disconnect();
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }


        @Override
        public void onConnected(Bundle connectionHint) {

            try {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    System.out.println("if block");

                    if (getActivity().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                            && getActivity().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                        // mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
                    }
                    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
                } else {
                    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
                }

                System.out.println("mLastLocation is====>" + mLastLocation);
                if (mLastLocation != null) {
                    latitude = mLastLocation.getLatitude();
                    longtude = mLastLocation.getLongitude();
                    System.out.println("Latitude====>" + mLastLocation.getLatitude());
                    System.out.println("Longitude====>" + mLastLocation.getLongitude());
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }


        private void checkDeviceGps() {

            try {

                PendingResult<LocationSettingsResult> pendingResult =
                        LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, locationSettingsRequest);
                pendingResult.setResultCallback(this);

            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

        @Override
        public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
            final Status status = locationSettingsResult.getStatus();
            switch (status.getStatusCode()) {

                case LocationSettingsStatusCodes.SUCCESS:
                    break;

                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        status.startResolutionForResult(getActivity(), 100);
                    } catch (IntentSender.SendIntentException e) {
                        e.printStackTrace();
                    }
                    break;
            }
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            switch (requestCode) {

                case 100:
                    getLatLong();
                    break;
            }
        }


        private void getLatLong() {

            try {
             if (mLastLocation != null) {
                    latitude = mLastLocation.getLatitude();
                    longtude = mLastLocation.getLongitude();
                    System.out.println("Latitude====>" + mLastLocation.getLatitude());
                    System.out.println("Longitude====>" + mLastLocation.getLongitude());
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

введите здесь описание изображения


person AbhiRam    schedule 03.11.2016    source источник
comment
Вы пытались подождать несколько секунд, скажем, 20-30, прежде чем искать данные после разрешения GPS   -  person Ak9637    schedule 03.11.2016
comment
как я могу это сделать, пожалуйста, объясните с кодом?   -  person AbhiRam    schedule 03.11.2016
comment
Вам нужно подождать несколько секунд, чтобы получить местоположение. Для этого можно использовать нить.   -  person K.Sopheak    schedule 03.11.2016
comment
да, я пытался, но бесполезно, тот же результат   -  person AbhiRam    schedule 03.11.2016
comment
Возможный дубликат Почему FusedLocationApi.getLastLocation null   -  person Alex    schedule 03.11.2016
comment
который не работает   -  person AbhiRam    schedule 03.11.2016
comment
Выглядит странно, какое устройство вы используете для тестирования?   -  person K.Sopheak    schedule 03.11.2016


Ответы (1)


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                System.out.println("if block");

                if (getActivity().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        && getActivity().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);Log.d("TAG",mLastLocation.getLatitude());


                }

            } else {
                mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            }

попробуйте это изменение и опубликуйте, какой ЖУРНАЛ вы получаете, если вы не получаете ЖУРНАЛ, это означает, что у вас нет необходимых разрешений, и если вы получаете журнал, но не местоположение, тогда мы можем исключить проблемы с разрешениями. Но то, каков уровень API вы тестируете?

person Ak9637    schedule 03.11.2016