当前位置: 首页 > 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.lryc.cn/news/583048.html

相关文章:

  • Android ViewModel机制与底层原理详解
  • upload-labs靶场通关详解:第19关 条件竞争(二)
  • 池化思想-Mysql异步连接池
  • 5.注册中心横向对比:Nacos vs Eureka vs Consul —— 深度解析与科学选型指南
  • Web 前端框架选型:React、Vue 和 Angular 的对比与实践
  • 华为静态路由配置
  • 小米路由器3C刷OpenWrt,更换系统/变砖恢复 指南
  • 语音识别核心模型的数学原理和公式
  • 从互联网电脑迁移Dify到内网部署Dify方法记录
  • 【编程史】IDE 是谁发明的?从 punch cards 到 VS Code
  • 计算机网络实验——访问H3C网络设备
  • Java项目集成Log4j2全攻略
  • Using Spring for Apache Pulsar:Publishing and Consuming Partitioned Topics
  • 飞算 JavaAI 智能编程助手 - 重塑编程新模态
  • bash 判断 /opt/wslibs-cuda11.8 是否为软连接, 如果是,获取连接目的目录并自动创建
  • (C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)
  • `fatal: bad config value for ‘color.ui‘`错误解决方案
  • ali linux 安装libreoffice
  • Markdown入门
  • 类和对象拓展——日期类
  • Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证
  • npu-smi info 华为昇腾NPU 状态监控工具解读
  • 类与对象【下篇】-- 关于类的其它语法
  • 树莓派vsftpd文件传输服务器的配置方法
  • 【02】MFC入门到精通——MFC 手动添加创建新的对话框模板
  • overleaf 改为XeLatex
  • Vue响应式原理四:响应式-监听属性变化
  • 正点原子学习 用户权限管理
  • 【python基础】运算符与布尔值全解析
  • 智慧航天运载体系全生命周期监测 | 图扑数字孪生