MapBox в Android: невозможно запросить разрешения на местоположение во фрагменте с помощью метода requestLocationPermissions - PullRequest
0 голосов
/ 29 мая 2020

Для моего проекта школы кодирования я использую карту mapbox во фрагменте. Мне удается добавить карту во фрагмент с нахождением моего (пользователя) местоположения. Однако он находит мое местоположение только тогда, когда я go вручную перехожу в настройки своего телефона и разрешаю разрешения местоположения для приложения. Я следил за учебниками и документацией по mapbox, однако, похоже, большая часть написана для карты MapBox, которая будет использоваться в этой деятельности. В учебниках по mapbox я вижу, что используется следующее:

private void enableLocation() {
    if (PermissionsManager.areLocationPermissionsGranted(getContext())) {
        initializeLocationEngine();
        initializeLocationLayer();
    } else {
        permissionsManager = new PermissionsManager(this); // THIS, HOWEVER WORKS IN THE FRAGMENT
       permissionsManager.requestLocationPermissions(this); //HERE IS MY PROBLEM
    }
}

Код, который я показал выше в моем приложении, я использую во фрагментах onCreateView, и поскольку параметром для метода requestLocationPermissions является действие, Я не могу запустить этот метод. Я пробовал разные варианты ссылки на mainActivity, с которым связан фрагмент, но безуспешно. Поэтому у меня вопрос - есть ли какое-нибудь простое go решение этой проблемы, где я могу каким-то образом передать действие в этом методе?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Этот пример в нашей документации показывает рекомендуемый подход для отображения местоположения пользователя во фрагменте карты на Android.

0 голосов
/ 29 мая 2020

Вы должны иметь возможность сделать requestPermissions(permissionsList, REQUEST_CODE); для запроса разрешения из фрагмента.
Нет необходимости передавать mainActivity контекст.

Как вы включаете свое местоположение? Обычно мне нравится делать это так:

@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {

    mapboxMap.setStyle(new Style.Builder()
            .fromUri("mapbox://styles/mapbox/navigation-guidance-night-v4")
            .withSource(new GeoJsonSource(ISOCHRONE_RESPONSE_GEOJSON_SOURCE_ID)), style -> {

        mapboxMap.getUiSettings().setCompassMargins(0, 180, 20, 0);
        // Map is set up and the style has loaded. Now you can add
        // data or make other map adjustments
        MainActivity.this.mapboxMap = mapboxMap;

        trafficPlugin = new TrafficPlugin(mapView, mapboxMap, Objects.requireNonNull(
                mapboxMap.getStyle()));
        this.trafficPlugin.setVisibility(false);

        this.style = style;

        // Create an empty GeoJSON source using the empty feature collection
        setUpSource();

        mapboxMap.addOnMapClickListener(MainActivity.this);
        mapboxMap.addOnMapLongClickListener(MainActivity.this);

        initEmptyLayer(Objects.requireNonNull(mapboxMap.getStyle()));
        setUpImage(Objects.requireNonNull(mapboxMap.getStyle()));

        enableLocationComponent(style);
    });
}

Затем в моей функции enableLocationCompnent:

@SuppressWarnings({"MissingPermission"})
private void enableLocationComponent(Style style) {
    // Check if permissions are enabled and if not request
    if (PermissionsManager.areLocationPermissionsGranted(this)) {

        LocationComponentOptions locationComponentOptions = LocationComponentOptions.builder(this)
                .layerAbove("empty-layer")
                .build();

        LocationComponentActivationOptions locationComponentActivationOptions = LocationComponentActivationOptions
                .builder(this, style)
                .locationComponentOptions(locationComponentOptions)
                .build();

        locationComponent = mapboxMap.getLocationComponent();
        // Activate with options
        locationComponent.activateLocationComponent(locationComponentActivationOptions);

        // Enable to make component visible
        locationComponent.setLocationComponentEnabled(true);

        // Set the component's camera mode
        locationComponent.setCameraMode(CameraMode.TRACKING);
        locationComponent.setRenderMode(RenderMode.COMPASS);
        initLocationEngine();

    } else {
        permissionsManager = new PermissionsManager(this);
        permissionsManager.requestLocationPermissions(this);
    }
}

Надеюсь, это поможет!

...