Карты Android: кнопка «Мое местоположение» не работает при первом запуске активности - PullRequest
0 голосов
/ 11 октября 2018

Когда я запускаю свою активность в Картах и ​​принимаю разрешения на местоположение в первый раз, если я нажимаю на кнопку «Мое местоположение», ничего не происходит.

Однако, если я закрываю действие и возвращаюсь к нему,после этого кнопка работает нормально!Итак, проблема возникает только после того, как я принимаю разрешения для первого запуска активности.

Если я воссоздаю активность после принятия разрешений, проблема решается, но мне не нравится это решение, плюс я хочупонять причину проблемы.

Что вызывает эту ошибку?

 public class MapsActivity extends FragmentActivity implements` OnMapReadyCallback {

        private GoogleMap mMap;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);

        GoogleMapOptions options = new GoogleMapOptions();
        options.mapType(GoogleMap.MAP_TYPE_NORMAL);

        mapFragment.newInstance(options);
        mapFragment.getMapAsync(this);
    }

#

public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
            requestLocationPermissions();
            mMap.getUiSettings().setMapToolbarEnabled(true);
    }

#

 public void requestLocationPermissions() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED ||
                ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED){

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    15);
        }else{

            mMap.setMyLocationEnabled(true);//needs location permission
            mMap.getUiSettings().setMyLocationButtonEnabled(true);

        }
    }

    @SuppressLint("MissingPermission")
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 15) {
            if (grantResults.length == 0) {
                requestLocationPermissions();
            } else {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED  ) {
                    Toast.makeText(this, "You have to accept all Permissions!", Toast.LENGTH_SHORT).show();
                    Log.e("Permission refused","Permission refused");
                    requestLocationPermissions();
                } else {
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED ) {
                    mMap.setMyLocationEnabled(true);
                    mMap.getUiSettings().setMyLocationButtonEnabled(true);
                   }
                }
            }
        }

    }

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

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

Таким образом, он работает все время без перезагрузки деятельности.

private void getDeviceLocation() {
        /*
         * Get the best and most recent location of the device, which may be null in rare
         * cases when a location is not available.
         */
        try {
            if (hasLocationPermission()) {
                fusedLocationClient
                        .getLastLocation()
                        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                            @Override
                            public void onSuccess(Location location) {
                                // Got last known location. In some rare situations this can be null.
                                if (location != null) {
                                    lastLocation = location;
                                    // Logic to handle location object
                                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                                            new LatLng(location.getLatitude(),
                                                    location.getLongitude()), DEFAULT_ZOOM));
                                    mMap.setOnMyLocationButtonClickListener(MapsActivity.this);
                                    mMap.setMyLocationEnabled(true);
                                    mMap.getUiSettings().setMyLocationButtonEnabled(true);
                                } else {
                                    mMap.setMyLocationEnabled(false);
                                    mMap.getUiSettings().setMyLocationButtonEnabled(false);
                                }
                            }
                        });
            }
        } catch (SecurityException e) {
            Log.e("Exception: %s", e.getMessage());
        }
    }

MapsActivity является слушателем GoogleMap.OnMyLocationButtonClickListener, а затем имеет этот код

@Override
public boolean onMyLocationButtonClick() {
    // I've tried just setting the default behavior of the button, but just works after reloading
    // the activity, then I've managed the click event to latest location; now it works for
    // all cases.
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
            new LatLng(lastLocation.getLatitude(),
                    lastLocation.getLongitude()), DEFAULT_ZOOM));
    return false;
}

Это код onMapReady

@SuppressLint("MissingPermission")
@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
    mMap.getUiSettings().setZoomControlsEnabled(true);

    getMuseums();

    if (!hasLocationPermission()) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_PERMISSION_LOCATION);
        return;
    }
    getDeviceLocation();
}

И мой фактический DEFAULT_ZOOMзначение равно 10.

0 голосов
/ 11 октября 2018

Отладьте свой код, чтобы проверить, какие значения широты и долготы вы получаете, когда впервые предоставляете разрешение.Местоположение может быть не установлено в этот момент.Если GPS еще не включен, получение точного местоположения занимает иногда немного больше времени.У меня была такая же проблема на некоторых устройствах, используемых для тестирования.

...