当前位置: 首页 > article >正文

Flutter定位权限处理全攻略:从iOS弹窗到Android后台定位,一个Demo搞定所有坑

Flutter定位权限处理全攻略从iOS弹窗到Android后台定位一个Demo搞定所有坑在Flutter应用开发中定位功能几乎是LBS类应用的标配但权限处理却让不少开发者头疼。iOS 14的精确定位临时授权、Android 10的后台定位权限、权限被永久拒绝后的引导流程...这些平台差异和边界情况如果处理不当轻则功能异常重则应用被拒。本文将带你用一套健壮的权限处理方案覆盖所有主流场景。1. 跨平台权限配置要点1.1 Android配置陷阱Android的权限系统随着版本迭代越来越复杂以下是必须注意的配置项!-- AndroidManifest.xml 必须包含的基础权限 -- uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION / uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION / !-- Android 10 后台定位必须声明 -- uses-permission android:nameandroid.permission.ACCESS_BACKGROUND_LOCATION / !-- Android 12 需要添加精确位置声明 -- uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION / uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION /关键细节ACCESS_BACKGROUND_LOCATION必须与前台权限同时声明Android 12需要单独处理BLUETOOTH_SCAN等关联权限后台定位需要额外在Google Play声明用途1.2 iOS的特殊要求iOS的定位权限体系更为严格Info.plist需要完整配置!-- 基础使用场景描述 -- keyNSLocationWhenInUseUsageDescription/key string需要您的位置提供周边服务/string !-- 后台定位描述 -- keyNSLocationAlwaysAndWhenInUseUsageDescription/key string持续获取位置以实现轨迹记录功能/string !-- iOS 14 临时精确定位 -- keyNSLocationTemporaryUsageDescriptionDictionary/key dict keyNavigationPurpose/key string需要精确位置进行导航指引/string /dict提示iOS后台定位必须开启Capabilities中的Background Modes → Location updates且需在App Store审核时提供充分理由2. 权限状态机与处理策略2.1 权限状态全映射通过geolocator获取的权限状态需要针对性处理状态iOS表现Android表现处理方案denied首次拒绝首次拒绝展示解释UI后再次请求deniedForever设置中关闭勾选不再询问跳转系统设置引导whileInUse仅前台可用同denied按需升级到alwaysalways前后台可用需额外后台权限检查后台权限2.2 健壮的权限请求流程FutureLocationPermissionStatus checkAndRequestPermission() async { // 1. 检查服务是否启用 if (!await Geolocator.isLocationServiceEnabled()) { final enabled await _showEnableDialog(); // 自定义弹窗 if (!enabled) return LocationPermissionStatus.serviceDisabled; } // 2. 检查当前权限状态 var permission await Geolocator.checkPermission(); // 3. 状态处理 switch (permission) { case LocationPermission.denied: permission await Geolocator.requestPermission(); if (permission LocationPermission.denied) { return LocationPermissionStatus.denied; } break; case LocationPermission.deniedForever: await _showSettingDialog(); // 引导去设置 return LocationPermissionStatus.deniedForever; case LocationPermission.whileInUse: if (needBackground) { return await _handleBackgroundPermission(); } break; default: break; } return LocationPermissionStatus.granted; }3. 平台差异的实战解决方案3.1 iOS临时精确定位处理iOS 14引入了临时精确定位授权需要特殊处理Futurebool requestTemporaryPrecision() async { if (Platform.isIOS await _isReducedAccuracy()) { return await Geolocator.requestTemporaryFullAccuracy( purposeKey: NavigationPurpose ); } return true; } Futurebool _isReducedAccuracy() async { if (!Platform.isIOS) return false; final status await Geolocator.getLocationAccuracy(); return status LocationAccuracyStatus.reduced; }3.2 Android后台定位兼容方案Android 10后台定位需要动态请求Futurebool requestBackgroundPermission() async { if (!Platform.isAndroid || !await _needBackground()) { return true; } if (await Geolocator.checkPermission() ! LocationPermission.always) { return false; } if (AndroidDeviceInfo.version.sdkInt 29) { return await Permission.locationAlways.request().isGranted; } return true; }4. 完整Demo核心实现4.1 状态管理架构推荐使用Riverpod实现权限状态管理final locationPermissionProvider StateNotifierProvider LocationPermissionNotifier, LocationPermissionState ((ref) LocationPermissionNotifier()); class LocationPermissionNotifier extends StateNotifierLocationPermissionState { Futurevoid checkAllPermissions() async { state state.copyWith(isLoading: true); final status await PermissionHandler.checkAndRequestPermission(); final accuracy await _checkAccuracy(); state state.copyWith( status: status, accuracy: accuracy, isLoading: false ); } }4.2 权限引导UI组件实现自适应各状态的UI组件class PermissionGuideOverlay extends StatelessWidget { override Widget build(BuildContext context) { return Consumer(builder: (_, ref, __) { final state ref.watch(locationPermissionProvider); return AnimatedSwitcher( duration: Duration(milliseconds: 300), child: _buildContentByState(state), ); }); } Widget _buildContentByState(LocationPermissionState state) { switch (state.status) { case LocationPermissionStatus.denied: return _buildRationaleDialog(); case LocationPermissionStatus.deniedForever: return _buildSettingRedirect(); case LocationPermissionStatus.accuracyReduced: return _buildPrecisionRequest(); default: return SizedBox.shrink(); } } }5. 疑难场景深度处理5.1 冷启动权限恢复应用冷启动时需要重新校验权限状态void initState() { super.initState(); WidgetsBinding.instance.addObserver( LifecycleEventHandler( resumeCallBack: () _checkPermissionStatus(), ), ); } Futurevoid _checkPermissionStatus() async { final lastStatus context.read(locationPermissionProvider).status; final currentStatus await PermissionHandler.checkPermission(); if (lastStatus ! currentStatus) { context.read(locationPermissionProvider.notifier).refresh(); } }5.2 后台定位保活策略Android后台定位需要结合前台服务Futurevoid startBackgroundTracking() async { if (Platform.isAndroid) { await FlutterForegroundTask.init( androidNotificationOptions: AndroidNotificationOptions( channelId: location_channel, channelName: 位置追踪, channelDescription: 正在后台记录您的位置, ), ); } final settings LocationSettings( accuracy: LocationAccuracy.bestForNavigation, distanceFilter: 50, androidSettings: AndroidSettings( foregroundNotificationConfig: ForegroundNotificationConfig( notificationTitle: 位置服务运行中, notificationText: 正在记录运动轨迹, ), ), ); Geolocator.getPositionStream(locationSettings: settings) .listen(_handlePositionUpdate); }在实现这些方案时发现Android不同厂商对后台定位的限制差异很大特别是小米、华为等国产ROM需要额外测试各种省电模式下的表现。建议在AndroidManifest中添加android:foregroundServiceTypelocation声明并在应用设置中引导用户关闭电池优化。

相关文章:

Flutter定位权限处理全攻略:从iOS弹窗到Android后台定位,一个Demo搞定所有坑

Flutter定位权限处理全攻略:从iOS弹窗到Android后台定位,一个Demo搞定所有坑 在Flutter应用开发中,定位功能几乎是LBS类应用的标配,但权限处理却让不少开发者头疼。iOS 14的精确定位临时授权、Android 10的后台定位权限、权限被永…...

Twinkle Tray显示器亮度管理终极指南:免费快速调节多显示器亮度

Twinkle Tray显示器亮度管理终极指南:免费快速调节多显示器亮度 【免费下载链接】twinkle-tray Easily manage the brightness of your monitors in Windows from the system tray 项目地址: https://gitcode.com/gh_mirrors/tw/twinkle-tray Twinkle Tray是…...

别再只盯着幅值了!用MatLab搞定CSI相位矫正,让你的无线定位更精准

别再只盯着幅值了!用MatLab搞定CSI相位矫正,让你的无线定位更精准 在无线感知与定位研究中,CSI(Channel State Information)的幅值信息长期占据着研究者的视线焦点,而相位信息却像被遗忘的金矿&#xff0c…...

Android设备管理终极指南:Escrcpy如何彻底改变你的工作流

Android设备管理终极指南:Escrcpy如何彻底改变你的工作流 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 在移动开发、测试和设备管…...

Python人脸识别入门:除了face-recognition,你还需要知道dlib库的这些安装“玄学”

Python人脸识别开发者的必修课:深入解析dlib库的安装逻辑与底层原理 人脸识别技术正在从实验室走向日常生活,而Python开发者往往被一个看似简单的安装问题绊住脚步——dlib库的安装。这个隐藏在face-recognition库背后的C图形库,为何会成为无…...

PyTorch增量学习超快

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PyTorch增量学习的超速优化:从边缘设备到实时AI的革命 目录 PyTorch增量学习的超速优化:从边缘设备到实时…...

从‘cp -r not specified’报错,聊聊Linux命令设计的‘潜规则’与学习心法

从‘cp -r not specified’报错,聊聊Linux命令设计的‘潜规则’与学习心法 第一次在终端里敲下cp folder1 folder2却看到cp: omitting directory的红色警告时,我盯着屏幕愣了三秒。这个看似"不友好"的错误提示,后来成了我理解Linux…...

告别SATA卡顿!5分钟搞懂NVMe SSD为啥这么快(附选购避坑指南)

告别SATA卡顿!5分钟搞懂NVMe SSD为啥这么快(附选购避坑指南) 当你按下开机键,盯着屏幕上转圈的加载图标;或是游戏载入时,看着进度条缓慢蠕动;又或是拷贝大型文件,进度百分比像老牛拉…...

RAGENativeUI:终极GTA模组界面开发指南,快速打造原生级游戏体验

RAGENativeUI:终极GTA模组界面开发指南,快速打造原生级游戏体验 【免费下载链接】RAGENativeUI 项目地址: https://gitcode.com/gh_mirrors/ra/RAGENativeUI 价值主张开篇:告别界面开发噩梦,拥抱高效创作时代 想象一下&a…...

别再问怎么装ipa了!从企业签到TF上架,iOS开发者最全的四种分发方案实战对比

iOS应用分发方案全解析:从企业签名到TestFlight上架实战指南 每次面对iOS应用分发这个老话题,总能看到开发者群里冒出各种"求推荐稳定签名服务"、"TF上架又被拒了怎么办"的求助。作为经历过数十个应用从内测到上线全周期的老手&…...

用Unity LayerMask玩出花:一个‘层’搞定游戏中的敌我识别、场景交互与UI管理

用Unity LayerMask玩出花:一个‘层’搞定游戏中的敌我识别、场景交互与UI管理 在游戏开发中,我们经常需要处理各种复杂的交互逻辑。想象一下,当玩家点击屏幕时,系统需要快速判断这次点击是针对敌人、可拾取物品还是UI按钮。传统做…...

利用 Taotoken 的 API Key 管理与访问控制功能实现团队权限分级

利用 Taotoken 的 API Key 管理与访问控制功能实现团队权限分级 1. 团队权限管理的核心需求 在中大型团队或企业环境中,不同成员或项目对大模型 API 的访问需求存在显著差异。开发团队可能需要高频调用测试环境模型,而产品团队只需访问生产环境&#x…...

如何安全备份微信聊天记录:5步完成数据保护的完整指南

如何安全备份微信聊天记录:5步完成数据保护的完整指南 【免费下载链接】WechatBakTool 基于C#的微信PC版聊天记录备份工具,提供图形界面,解密微信数据库并导出聊天记录。 项目地址: https://gitcode.com/gh_mirrors/we/WechatBakTool …...

解锁Switch游戏新境界:3步掌握大气层整合包安装与优化

解锁Switch游戏新境界:3步掌握大气层整合包安装与优化 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想要彻底释放Nintendo Switch的游戏潜力吗?大气层&#xff08…...

AKShare金融数据接口库:Python量化分析的完整高效解决方案

AKShare金融数据接口库:Python量化分析的完整高效解决方案 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirrors/ak…...

Visual C++运行库依赖难题的系统级解决方案:VisualCppRedist AIO项目深度解析

Visual C运行库依赖难题的系统级解决方案:VisualCppRedist AIO项目深度解析 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 问题场景:Win…...

YOLOv5/v8训练时,如何选择IoU Loss?从IoU到Wise-IoU的保姆级对比与实战配置

YOLOv5/v8训练中IoU Loss的实战选择指南:从基础原理到Wise-IoU调优 当我在去年优化一个工业零件检测项目时,面对产线上不同尺寸的零件,发现简单的IoU Loss导致小目标检测效果极差。经过两周的对比实验,最终通过Wise-IoU将mAP0.5提…...

新手友好:在快马平台用windowscleaner项目轻松入门python文件系统编程

最近在学Python文件操作,发现用InsCode(快马)平台做实际项目特别适合新手。今天就用一个Windows清理脚本的案例,带大家体验如何从零开始理解文件系统编程。 项目背景理解 这个脚本的核心功能是帮我们自动清理长期不用的压缩包。想象一下,下载…...

为内部知识库构建基于 TaoToken 多模型选择的问答引擎

为内部知识库构建基于 TaoToken 多模型选择的问答引擎 1. 企业知识库的模型选型需求 企业内部知识库通常需要处理多样化的查询场景,从技术文档检索到人力资源政策解读,不同任务对模型能力的需求差异显著。单一模型往往难以在所有场景下都达到最优效果&…...

Linux后台运行脚本,如何优雅地管理日志和避免nohup.out文件爆炸?

Linux后台运行脚本的日志管理艺术:告别nohup.out混乱时代 凌晨三点,服务器警报突然响起——磁盘空间不足。登录排查后发现是某个后台任务的nohup.out文件已经膨胀到几十GB,而真正需要关注的错误信息早已淹没在日志海洋中。这种场景对于长期在…...

EtherCAT调试翻车实录:从‘卡在Safe-OP’到‘PDO数据对不上’的完整排错指南

EtherCAT实战排错指南:从Safe-OP状态到PDO数据异常的深度解析 那天深夜,实验室里只剩下示波器的荧光和我的咖啡杯。面对着一台死活不肯进入OP状态的伺服电机,我意识到这将是个漫长的夜晚。这不是我第一次遇到EtherCAT调试问题,但每…...

郑斯仁棒球写真曝光,挥棒蓄力少年如斯

近日,一组以棒球为灵感的运动写真曝光了郑斯仁最松弛的模样。镜头下的郑斯仁,时而戴着黑色头盔凝视远方,眼神里藏着锐气与沉思;时而手握球棒,在蓝天绿草间摆出击球姿势,白色运动装衬得他身姿挺拔&#xff0…...

轻量级Web UI框架cow-webui:快速构建中后台系统的组件化实践

1. 项目概述:一个面向开发者的轻量级Web UI框架 最近在GitHub上闲逛,又发现了一个挺有意思的仓库: FEEHarrison/cow-webui 。光看名字, cow (奶牛)这个前缀就挺抓人眼球,带着点自嘲和轻松的…...

终极指南:5分钟掌握Pseudogen源代码转伪代码智能转换

终极指南:5分钟掌握Pseudogen源代码转伪代码智能转换 【免费下载链接】pseudogen A tool to automatically generate pseudo-code from source code. 项目地址: https://gitcode.com/gh_mirrors/ps/pseudogen 你是否曾面对一段复杂的Python代码,需…...

Node-RED版本踩坑实录:从Node.js 18升级到20,我的Modbus节点为什么挂了?

Node-RED版本升级避坑指南:从Node.js 18迁移到20的实战经验 那天凌晨三点,生产环境的告警短信把我从睡梦中惊醒——Modbus数据采集流程全部中断。就在前一天,我刚刚将服务器上的Node.js从18.x升级到20.x,本以为是一次常规版本迭代…...

自托管Docker容器Web管理界面:轻量级container-ui部署与实战

1. 项目概述:一个为容器化应用量身定制的Web管理界面 如果你和我一样,日常工作中需要管理一堆Docker容器,从开发环境的微服务到生产环境的数据库,那你肯定对命令行界面(CLI)又爱又恨。爱的是它的强大和精准…...

LVGL Table实战:手把手教你打造一个带合并单元格和自定义样式的嵌入式UI数据表格

LVGL Table实战:手把手教你打造一个带合并单元格和自定义样式的嵌入式UI数据表格 在嵌入式设备上展示复杂数据时,表格是最直观的呈现方式之一。但默认的LVGL Table控件往往显得单调,难以满足专业级UI的需求。本文将带你深入探索LVGL Table的…...

B站缓存视频解锁指南:3分钟无损转换m4s为MP4的完整方案

B站缓存视频解锁指南:3分钟无损转换m4s为MP4的完整方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾在B站缓存了珍贵的视…...

避坑指南:YOLOv8转ONNX时遇到‘silu算子不支持’报错?手把手教你修改PyTorch源码解决

YOLOv8模型转ONNX实战:解决silu算子不支持报错的深度优化方案 当我们将YOLOv8模型从PyTorch格式转换为ONNX时,经常会遇到一个令人头疼的错误:"Exporting the operator silu to ONNX opset version 12 is not supported"。这个错误…...

超越数据手册:用S32K324的BCTU与注入触发构建高响应实时控制系统

超越数据手册:用S32K324的BCTU与注入触发构建高响应实时控制系统 在工业自动化与电力电子领域,实时控制系统的响应速度往往决定着整个设备的性能上限。当电机控制遇到突发过流,或电源管理检测到电压瞬变时,传统基于软件轮询的ADC采…...