LocationServices.FusedLocationApi.getLastLocation возвращает null

342
03 июля 2017, 17:22

Возвращает нулевой указатель в методе getCurrrentLocation(). Как это исправить в моем случае? Заранее благодарю за помощь!

Код:

public class CreateRoom extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
            GoogleApiClient.OnConnectionFailedListener,
            GoogleMap.OnMarkerDragListener,
            GoogleMap.OnMapLongClickListener,
            GoogleMap.OnMarkerClickListener,
            View.OnClickListener {
        private static final String STATUS_FAIL = "failed";
        private static final String STATUS_SUCCESS = "success";
        EditText editTextNewRoomTitle;
        GoogleMap mMap;
        private GoogleApiClient googleApiClient;
        AsyncHttpClient client = new AsyncHttpClient();
        LocationRequest locationRequest;
        User user;
        Room room = null;
        private double longitude;
        private double latitude;
        LocationManager locationManager;

        public static CreateRoom newInstance() {
            CreateRoom fragment = new CreateRoom();
            fragment.setArguments(new Bundle());
            return fragment;
        }
        @Override
        public void onCreate(Bundle savedInstanceState) {
            Log.i("fg", "onCreate");
            super.onCreate(savedInstanceState);
            user = getArguments().getParcelable("user");

        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            Log.i("fg", "onCreateView");
            View view = inflater.inflate(R.layout.create_room, container, false);
            editTextNewRoomTitle = (EditText) view.findViewById(R.id.editTextNewRoomTitle);
            SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
                    .findFragmentById(R.id.mapToday);
            mapFragment.getMapAsync(this);
            return view;
        }
        @Override
        public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
            Log.i("fg", "onViewCreated");
            googleApiClient = new GoogleApiClient.Builder(getContext())
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();

        }
        @Override
        public void onStart() {
            Log.i("fg", "onStart");
            super.onStart();
            googleApiClient.connect();

        }
        @Override
        public void onMapReady(GoogleMap googleMap) {
            Log.i("fg", "onMapReady");
            mMap = googleMap;
            mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            mMap.setOnMarkerDragListener(this);
            mMap.setOnMapLongClickListener(this);

        }
        @Override
        public void onConnected(@Nullable Bundle bundle) {
            Log.i("fg", "onConnected");
            getCurrentLocation();
        }

        @Override
        public void onClick(View v) {
        }

        @Override
        public void onConnectionSuspended(int i) {
        }
        @Override
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        }
        @Override
        public void onMapLongClick(LatLng latLng) {
            mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
        }
        @Override
        public boolean onMarkerClick(Marker marker) {
            return true;
        }
        @Override
        public void onMarkerDragStart(Marker marker) {
        }
        @Override
        public void onMarkerDrag(Marker marker) {
        }
        @Override
        public void onMarkerDragEnd(Marker marker) {
            latitude = marker.getPosition().latitude;
            longitude = marker.getPosition().longitude;
            //move to current position
            moveMap();
        }

        private void getCurrentLocation() {

            if (ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
            if (location != null) {
                //Getting longitude and latitude
                longitude = location.getLongitude();
                latitude = location.getLatitude();
                //moving the map to location
                moveMap();
            }
        }

        @Override
        public void onStop() {
            super.onStop();
            googleApiClient.disconnect();

        }
        private void moveMap() {
            Log.i("fg", "moveMap");
            /**
             * Creating the latlng object to store lat, long coordinates
             * adding marker to map
             * move the camera with animation
             */
            LatLng latLng = new LatLng(latitude, longitude);
            mMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .draggable(true)
                    .title(""));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            mMap.animateCamera(CameraUpdateFactory.zoomTo(15));
            mMap.getUiSettings().setZoomControlsEnabled(true);
        }

    }

Manifest permissions:

<uses-permission android:name="android.permission.INTERNET" />
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <!--
     The following two permissions are not required to use
     Google Maps Android API v2, but are recommended.
    -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <permission
        android:name="com.example.uncolor.lobsang.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.example.uncolor.lobsang.permission.MAPS_RECEIVE" />
Answer 1

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

Теперь к сути

1 момент:

getCurrentLocation() - хорошее название для метода, а главное логичное, но код, который в нем лежит, а именно:

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
    //Getting longitude and latitude
    longitude = location.getLongitude();
    latitude = location.getLatitude();
    //moving the map to location
    moveMap();
}

Должен находится в заведомо готовом методе OnLocationChanged()

OnLocationChanged() - Вызывается автоматически, когда местоположение изменилось.

@Override
public void onLocationChanged(Location location) {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    if (location != null) {
        //Getting longitude and latitude
        longitude = location.getLongitude();
        latitude = location.getLatitude();
        //moving the map to location
        moveMap();
    }
}

P.S. предварительно implements LocationListener

2 момент:

Отсутствует: mMap.setMyLocationEnabled(true); в методе onMapReady().

Вообще отсутствует...

3 момент:

Не наблюдаю в коде запроса на обновление местоположения.

@Override
public void onConnected(@Nullable Bundle bundle) {
    mLocationRequest = new LocationRequest().setInterval(1).setFastestInterval(1).setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
READ ALSO
Как найти и вызвать файл в jsp

Как найти и вызвать файл в jsp

Здравствуйте, не могу найти файл и вызвать егоесть проект структура папок -

291
ListView слушатель события

ListView слушатель события

Приходит json в ListView с именамитег, имя и т

409
Как создать объект доступный из @ClientEndpoint и @ServerEndpoint?

Как создать объект доступный из @ClientEndpoint и @ServerEndpoint?

Я использую web-socket и необходимо получить объект который будет доступен и в @ClientEndpoint и @ServerEndpoint и желательно не статическийВозможно ли это...

276
Почему код работает в Intellij IDEA, а в Android Studio нет?

Почему код работает в Intellij IDEA, а в Android Studio нет?

Здравствуйте, я пытаюсь зашифровать некую строку текста encrypt а затем расшифровать decrypt, попробовав пример кода в Intellij IDEA все сработало замечательно,...

412