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
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();
|
|
}
|
|
}
|
|
|