| | |
| | | import 'dart:async'; |
| | | |
| | | import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'; |
| | | import 'package:flutter_bmflocation/bdmap_location_flutter_plugin.dart'; |
| | | import 'package:flutter_bmflocation/flutter_baidu_location.dart'; |
| | | import 'package:flutter_bmflocation/flutter_baidu_location_android_option.dart'; |
| | | import 'package:flutter_bmflocation/flutter_baidu_location_ios_option.dart'; |
| | | import 'package:locations/api/http.dart'; |
| | | import 'package:locations/model/map/location_model.dart'; |
| | | import 'package:locations/utils/user_util.dart'; |
| | | import 'package:permission_handler/permission_handler.dart'; |
| | | |
| | | typedef OnLocationCallback = void Function(Map map); |
| | | import 'global.dart'; |
| | | |
| | | typedef OnLocationCallback = void Function(LocationState state, Map? map); |
| | | |
| | | class LocationUtil { |
| | | static LocationFlutterPlugin? _locationFlutterPlugin=LocationFlutterPlugin(); |
| | | static LocationFlutterPlugin? _locationFlutterPlugin = |
| | | LocationFlutterPlugin(); |
| | | |
| | | static Map _getAndroidOption(int scanspan) { |
| | | BaiduLocationAndroidOption androidOption = new BaiduLocationAndroidOption(); |
| | |
| | | /// 可选,设置发起定位请求的间隔,int类型,单位ms |
| | | /// 如果设置为0,则代表单次定位,即仅定位一次,默认为0 |
| | | /// 如果设置非0,需设置1000ms以上才有效 |
| | | // androidOption.setLocationPurpose(BDLocationPurpose.SignIn); |
| | | androidOption.setLocationPurpose(BDLocationPurpose.Sport); |
| | | |
| | | /// 可选,设置场景定位参数,包括签到场景、运动场景、出行场景,可选值如下: |
| | | /// 签到场景: BDLocationPurpose.SignIn |
| | |
| | | return iosOption.getMap(); |
| | | } |
| | | |
| | | static void init(int scanSpan) { |
| | | _locationFlutterPlugin!.prepareLoc( |
| | | _getAndroidOption(scanSpan), _getIosOption()); |
| | | } |
| | | |
| | | static void startLocation(OnLocationCallback callback) async { |
| | | static Future<StreamSubscription<Map<String, Object>?>?> startLocation( |
| | | int scanSpan, OnLocationCallback callback) async { |
| | | final status = await requestLocationPermission(); |
| | | if (status.isGranted) { |
| | | print("定位权限申请通过"); |
| | | } else { |
| | | print("定位权限申请不通过"); |
| | | callback(LocationState.permission_denied, null); |
| | | return null; |
| | | } |
| | | |
| | | StreamSubscription<Map<String, Object>?> subscription = |
| | | _locationFlutterPlugin! |
| | | .onResultCallback() |
| | | .listen((Map<String, Object>? result) { |
| | | print("定位结果:$result"); |
| | | Global.currentPosition = BMFCoordinate.fromMap(result!); |
| | | UserUtil.isLogin().then((value) { |
| | | if (value) { |
| | | LocationApiUtil.uploadLocation(BaiduLocation.fromJson(result)); |
| | | } |
| | | }); |
| | | |
| | | callback(LocationState.success, result); |
| | | if (scanSpan == 0) { |
| | | stopLocation(); |
| | | } |
| | | }); |
| | | |
| | | _locationFlutterPlugin! |
| | | .prepareLoc(_getAndroidOption(scanSpan), _getIosOption()); |
| | | |
| | | _locationFlutterPlugin!.startLocation(); |
| | | Stream<Map<String, Object>?> result = |
| | | _locationFlutterPlugin!.onResultCallback(); |
| | | await for (Map<String, Object>? s in result) { |
| | | callback(s!); |
| | | } |
| | | |
| | | return subscription; |
| | | } |
| | | |
| | | ///请求定位权限 |
| | |
| | | final status = await Permission.location.request(); |
| | | return status; |
| | | } |
| | | |
| | | static stopLocation() { |
| | | if (_locationFlutterPlugin != null) { |
| | | _locationFlutterPlugin!.stopLocation(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | enum LocationState { success, permission_denied } |