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

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.xdnf.cn/news/15136.html

相关文章:

  • 图像处理中的凸包检测:原理与实现
  • Protable 问题记录
  • 神经网络简介
  • [IMX][UBoot] 13.Linux 内核源码目录分析
  • 【Linux】权限的概念及理解
  • 【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程
  • RabbitMQ 4.1.1-Local random exchange体验
  • 【linux】ssh使用-X参数后报错:X11 forwarding request failed on channel 0
  • 深度学习 最简单的神经网络 线性回归网络
  • Python-文件操作-StringIO和BytesIO-路径操作-shutil模块-csv,ini序列化和反序列化-argparse使用-学习笔记
  • 蛋白质序列-kappa参数计算算法解读
  • 苍穹外卖项目日记(day04)
  • qt-C++笔记之布局管理`space` 和 `margin`的区别
  • 基于pytorch.nn模块实现线性模型
  • c语言中的数组II
  • OpenCV图片操作100例:从入门到精通指南(4)
  • (C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)
  • Android-重学kotlin(协程源码第一阶段)新学习总结
  • STM32-看门狗
  • (5)机器学习小白入门 YOLOv:数据需求与图像不足应对策略
  • qml加载html以及交互
  • Qt去噪面板搭建
  • Flutter基础(前端教程⑦-Http和卡片)
  • 【EGSR2025】材质+扩散模型+神经网络相关论文整理随笔(二)
  • 图片的拍摄创建日期怎么改?保护好图片信息安全的好方法
  • 李宏毅NLP-9-语音转换
  • 全球发展币GDEV:从中国出发,走向全球的数字发展合作蓝图
  • 本地Qwen中医问诊小程序系统开发
  • kubernetes存储入门
  • Flutter编译安卓应用时遇到的compileDebugJavaWithJavac和compileDebugKotlin版本不匹配的问题