import '/core/utils/logger.dart'; import 'package:get/get.dart'; import 'package:location_service/location_service.dart'; import 'package:permission_handler/permission_handler.dart'; import '/core/utils/permission_util.dart'; /// 定位管理 class LocationManager extends GetxService { static LocationManager get to => Get.find(); final LocationService _locationService = LocationService(); /// 初始化 /// /// 合规(场景 1/2):这里**不能**申请定位权限。 /// 这个 Service 是 lazyPut 出来的,任何页面 find 一下就会触发 onInit, /// 原来在这里申请 locationAlways(后台定位),等于用户没点任何跟定位有关的 /// 功能、甚至刚进首页就被弹后台定位框,属于「申请与当前服务场景无关的权限」。 /// 现在改成用到定位时由 [ensureLocationPermission] 按场景申请。 @override void onInit() { super.onInit(); } /// 当前是否已有定位权限(只查不申请,供 UI 置灰判断) Future get hasLocationPermission => PermissionUtil.instance.hasPermission(Permission.locationWhenInUse); /// 用户拒绝过、还在 48h 冷却里 —— UI 应把定位相关入口置灰 bool get isPermissionCoolingDown => PermissionUtil.instance.isDenialCoolingDown(Permission.locationWhenInUse); /// 在真正需要定位的场景下申请权限。 /// /// 申请的是 locationWhenInUse(使用期间),不是 locationAlways—— /// 本 App 没有后台持续定位的场景,申请后台定位过不了合规审核。 /// /// 返回 false 表示拿不到权限(用户拒绝或处于冷却期),调用方应把功能置灰 /// 或退出,**不要**再补弹窗。 Future ensureLocationPermission() async { final granted = await PermissionUtil.instance.requestPermission( permissionType: Permission.locationWhenInUse, permissionName: 'locationPermission'.tr, explanationText: 'locationPermissionExplanation'.tr, permanentDenialText: 'locationPermissionPermanentDenial'.tr, ); if (!granted) { Logger.warning('定位权限未授予,定位功能不可用'); } return granted; } //定位 Future> location() async { return await _locationService.location(); } }