GeoLocation 包在真实设备上运行时无法正常工作

时间:2021-05-31 13:43:12

标签: flutter google-maps

import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';
//import 'package:provider/provider.dart';

class Map extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _MapState();
}

class _MapState extends State<Map> {
  Completer<GoogleMapController> _controllerGoogleMap = Completer();
  GoogleMapController newGoogleMapController;

  Position currentPosition;
  var geoLocator = Geolocator();

  void locatePosition() async {
    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.best);
    currentPosition = position;

    LatLng latLngPos = LatLng(position.latitude, position.longitude);

    CameraPosition cameraPosition =
        CameraPosition(target: latLngPos, zoom: 15.0);

    newGoogleMapController
        .animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
  }

  static final CameraPosition _kGooglePlex = CameraPosition(
    target: LatLng(37.42796133580664, -122.085749655962),
    zoom: 14.4746,
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: GoogleMap(
          mapType: MapType.normal,
          myLocationButtonEnabled: true,
          initialCameraPosition: _kGooglePlex,
          myLocationEnabled: true,
          zoomGesturesEnabled: true,
          zoomControlsEnabled: true,
          onMapCreated: (GoogleMapController controller) {
            _controllerGoogleMap.complete(controller);
            newGoogleMapController = controller;
            locatePosition();
          },
        ),
      ),
    );
  }
}

调试终端下

Launching lib\main.dart on vivo 1906 in debug mode... 
lib\main.dart:1 √ Built build\app\outputs\flutter-apk\app-debug.apk. I/flutter ( 9154):
Observatory listening on ************************************ I/flutter ( 9613): 
Observatory listening on ************************************ E/flutter ( 9613): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception:
User denied permissions to access the device's location. E/flutter ( 9613): 
#0 MethodChannelGeolocator._handlePlatformException package:geolocator_platform_interface/…/implementations/method_channel_geolocator.dart:199 
E/flutter ( 9613): #1 MethodChannelGeolocator.getCurrentPosition package:geolocator_platform_interface/…/implementations/method_channel_geolocator.dart:
118 E/flutter ( 9613): <asynchronous suspension> E/flutter ( 9613): #2 _MapState.locatePosition package:donation_yoga/screens/maps.dart:
21 E/flutter ( 9613): <asynchronous suspension> E/flutter ( 9613):

我从未拒绝过我的许可, 即使我已启用它来获取当前位置,地图也不会显示我的位置按钮, 只显示放大和缩小按钮和地图。

使用 Flutter 2.2.1 google_maps_flutter:^2.0.6 地理定位器:^7.0.3

PS:我尝试过定位包,但它抛出了很多错误,例如 location_web not found 等,

1 个答案:

答案 0 :(得分:0)

尝试将 forceLocationManager 子句添加到您的函数中:

  void locatePosition() async {

  Position position = await Geolocator.getLastKnownPosition({ bool forceAndroidLocationManager = true}
    );
  currentPosition = position;


  LatLng latLngPos = LatLng(position.latitude, position.longitude);

  CameraPosition cameraPosition =
    CameraPosition(target: latLngPos, zoom: 15.0);

  newGoogleMapController
    .animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
  }

还要检查您的 android manifest 以获取位置:

<manifest ... >
 <!-- To request foreground location access, declare one of these 
 permissions. -->
  <uses-permission 
  android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" 
 />
 </manifest>

还要保持您想要的准确度较低,准确度充其量会造成设备的隐私混乱,因此需要额外的步骤