You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

57 lines
2.3 KiB

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<LocationManager>();
final LocationService _locationService = LocationService();
/// 初始化
///
/// 合规(场景 1/2):这里**不能**申请定位权限。
/// 这个 Service 是 lazyPut 出来的,任何页面 find 一下就会触发 onInit,
/// 原来在这里申请 locationAlways(后台定位),等于用户没点任何跟定位有关的
/// 功能、甚至刚进首页就被弹后台定位框,属于「申请与当前服务场景无关的权限」。
/// 现在改成用到定位时由 [ensureLocationPermission] 按场景申请。
@override
void onInit() {
super.onInit();
}
/// 当前是否已有定位权限(只查不申请,供 UI 置灰判断)
Future<bool> get hasLocationPermission =>
PermissionUtil.instance.hasPermission(Permission.locationWhenInUse);
/// 用户拒绝过、还在 48h 冷却里 —— UI 应把定位相关入口置灰
bool get isPermissionCoolingDown =>
PermissionUtil.instance.isDenialCoolingDown(Permission.locationWhenInUse);
/// 在真正需要定位的场景下申请权限。
///
/// 申请的是 locationWhenInUse(使用期间),不是 locationAlways——
/// 本 App 没有后台持续定位的场景,申请后台定位过不了合规审核。
///
/// 返回 false 表示拿不到权限(用户拒绝或处于冷却期),调用方应把功能置灰
/// 或退出,**不要**再补弹窗。
Future<bool> 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<Map<String, dynamic>> location() async {
return await _locationService.location();
}
}