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

uniapp AndroidiOS 定位权限检查

定位权限检查

// 检查定位权限状态
export const checkPermission = () => {const platform = uni.getSystemInfoSync().platform;console.log('platform', platform)// #ifdef APP-PLUSif (platform === 'android') {// Androidreturn checkAndroidPermission();} else if (platform === 'ios') {// iOSreturn checkIOSPermission();}// #endif
};/*** 获取Android定位权限状态* @returns {Promise<string>} 返回权限状态:*   'granted_always' - 始终允许*   'granted_when_in_use' - 仅在使用时允许 (Android 10+)*   'denied' - 已拒绝*   'denied_forever' - 拒绝且不再询问*/
// Android 检测权限
export const checkAndroidPermission = () => {return new Promise((resolve) => {// #ifdef APP-PLUS// 0-引导 1-允许 2-设置const main = plus.android.runtimeMainActivity();const ActivityCompat = plus.android.importClass('androidx.core.app.ActivityCompat');const PackageManager = plus.android.importClass('android.content.pm.PackageManager');const Manifest = plus.android.importClass('android.Manifest');const ContextCompat = plus.android.importClass('androidx.core.content.ContextCompat');// 检查是否已授权const hasFineLocation = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED;const hasCoarseLocation = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_COARSE_LOCATION) === PackageManager.PERMISSION_GRANTED;if (!hasFineLocation && !hasCoarseLocation) {// 如果完全没有权限,检查是否被永久拒绝console.log("Android 权限被拒绝")resolve(2);return;}// 如果有权限,检查是否是"始终允许" (Android 10+)if (plus.os.version >= 10) {const AppOpsManager = plus.android.importClass('android.app.AppOpsManager');const appOps = main.getSystemService('appops');const mode = plus.android.invoke(appOps,'checkOpNoThrow',AppOpsManager.OPSTR_FINE_LOCATION,main.getApplicationInfo().uid,main.getPackageName());// 处理可能的null返回值if (mode === null) {console.warn('checkOpNoThrow返回null,降级检查运行时权限');const hasPermission = ContextCompat.checkSelfPermission(main,Manifest.permission.ACCESS_FINE_LOCATION) === PackageManager.PERMISSION_GRANTED;console.log("降级检查运行hasPermission", hasPermission)resolve(hasPermission ? 1 : 2);return;}console.log("Android===mode", mode)switch (mode) {case 0: // MODE_ALLOWEDconsole.log('始终允许定位');resolve(1);break;case 4: // MODE_FOREGROUNDconsole.log('仅允许前台定位');resolve(1);break;case 1: // MODE_IGNOREDconsole.log('已拒绝但可再次请求');resolve(1);break;case 2: // MODE_ERROREDconsole.log('已永久拒绝需手动设置');resolve(2);break;default:console.log('其他状态', mode);}} else {// Android 9及以下无法区分"始终允许"和"仅在使用时允许"console.log("Android 权限始终允许")resolve(1);}});// #endif
}// iOS 检测权限
export const checkIOSPermission = () => {console.log('iOS 检测权限');return new Promise((resolve, reject) => {// #ifdef APP-PLUSconst cllocationManger = plus.ios.import('CLLocationManager');const status = cllocationManger.authorizationStatus();const enable = cllocationManger.locationServicesEnabled();// 0-引导 1-允许 2-设置// status 含义:// 0: 未决定(kCLAuthorizationStatusNotDetermined)// 2: 已拒绝(kCLAuthorizationStatusDenied)// 3: 始终允许(kCLAuthorizationStatusAuthorizedAlways)// 4: 仅使用时允许(kCLAuthorizationStatusAuthorizedWhenInUse)console.log('status', status);if (!enable) {resolve(2);} else if (status === 2) {// 拒绝resolve(2);} else if (status === 4) {// 仅使用时允许resolve(0);} else if (status === 3) {// 未决定resolve(1);} else {resolve(0);}plus.ios.deleteObject(cllocationManger);// #endif});
};// 权限请求
export const getAndroidLocation = () => {return new Promise((resolve, reject) => {plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'],(result) => {console.log('android,', result);// 0-引导 1-允许 2-设置if (result.granted.length) {console.log('Android 已授予定位权限');resolve(1);} else if (result.deniedAlways.length) {// 拒绝,跳转系统设置console.log('Android 已拒绝定位权限');resolve(2);} else {resolve(0);}},(error) => {console.log("Android 检测权限---err", error)reject(error);});})
}

使用

		if (check) {// #ifdef APP-PLUScheckPermission().then(async code => {uni.setStorageSync("locationPermissions", true);console.log("code", code)// 0-引导 1-允许 2-设置if (code === 0) {console.log("权限引导")} else if (code === 1) {console.log("允许");} else if (code === 2) {console.log("跳转权限设置")}}).catch((err) => {console.log("报错", err)uni.showModal({content: '检测权限失败,请确认是否打开GPS,再重启APP',showCancel: false,confirmText: "去开启",success(res) {uni.openAppAuthorizeSetting()}})})}
http://www.dtcms.com/a/270606.html

相关文章:

  • ragflow_多模态文档解析与正文提取策略
  • 《设计模式之禅》笔记摘录 - 5.代理模式
  • Flutter基础(前端教程⑨-图片)
  • Robot之眼CMOS传感器静电防护指南
  • LeetCode热题100—— 32. 最长有效括号 (hard)
  • 零基础上手 Amazon DynamoDB:NoSQL 数据库服务的核心概念与快速搭建指南
  • Android-重学kotlin(协程源码第二阶段)新学习总结
  • 安全管理协议(SMP):配对流程、密钥生成与防中间人攻击——蓝牙面试核心考点精解
  • Qt自定义控件(9)——径向渐变QRadialGradient、圆锥渐变QConicalGradient
  • 华为OD机试_2025 B卷_观看文艺汇演问题(Python,100分)(附详细解题思路)
  • Amazon S3 对象存储服务深度解析:存储原理、应用场景与实战指南
  • Hexo + Butterfly + Vercel 完整个人Blog部署指南
  • 量子化学计算GPU化:ORCA与Gaussian的CUDA加速对比(电子积分计算中的Warpshuffle指令实战应用)
  • 如何给网页增加滚动到顶部的功能
  • 【具身智能】本地实时语音识别kaldi在正点原子RK3588上部署
  • Python标准库:时间与随机数全解析
  • python 异步编程事件循环的共享问题
  • 达梦:指定数据文件还原的路径
  • 【Linux | 网络】socket编程 - 使用TCP实现服务端向客户端提供简单的服务
  • Ragas的Prompt Object
  • 大数据在UI前端的应用深化:用户行为模式的挖掘与预测性分析
  • 网络信息安全学习笔记1----------网络信息安全概述
  • 2025年新材料与清洁能源国际会议(IACNMCE 2025)
  • 计算机网络实验——访问H3C网络设备
  • 题解:P13017 [GESP202506 七级] 线图
  • 【机器学习】BeamSearch算法
  • BEV感知2
  • python学习打卡:DAY 24 元组和OS模块
  • 5202年安装TensorFlow纪实
  • 【LeetCode207.课程表】以及变式