uni-app中获取定位方法 uni.getLocation ,当用户拒绝app授权或者系统GPS定位没有开启时,引导用户跳转到设置页面

只考虑app中的授权问题

效果图

应用定位权限

在这里插入图片描述
app无权限

系统定位权限

在这里插入图片描述
系统定位无权限

当没有app权限时, 点击获取定位 弹窗

在这里插入图片描述
点击 去设置 跳转到app权限设置页面
在这里插入图片描述

当没有系统定位权限时, 点击定位 弹窗

在这里插入图片描述
点击 去设置 跳转到系统定位服务设置页面
在这里插入图片描述

代码

// 获取位置信息
uni.getLocation({
   type: 'wgs84',  // 获取wgs84坐标系的经纬度
	success: (res) => {
	 this.latitude = res.latitude;
	 this.longitude = res.longitude;
	 // console.log('当前位置wgs84:', res.latitude, res.longitude);
	 // 获取成功
			
   },
   fail: (err) => {
		console.error('获取位置失败', err);
		// 获取位置失败时,进行弹窗
	    this.showPermissionAlert();
	
   }
 });

弹窗前先判断 系统定位没开启 还是 应用定位没有开启

// 弹窗设置逻辑
async showPermissionAlert() {
	// 判断是系统定位没开启 还是应用定位没有开启
	// 1. 先检查App是否有定位权限
	const hasAppPermission = await deviceJX.checkAppLocationPermission();
	// console.log("App是否有定位权限:" +  hasAppPermission);
	if (!hasAppPermission) {
		// 跳转APP权限设置页
		uni.showModal({
		 title: '权限申请',
		 content: '需要应用位置权限,请前往设置开启',
		 confirmText: '去设置',
		 success: (res) => {
		   if (res.confirm) {
			 this.openAppPermissionSettings();
		   }
		 }
	   });

		return;
	}
		   
	// 2. 再检查系统定位服务是否开启
	 const isSystemEnabled = await deviceJX.checkSystemLocationService();
	 // console.log("系统定位权限:" +  isSystemEnabled);
	  if (!isSystemEnabled) {
	       //跳转系统定位设置 
		   uni.showModal({
				 title: '权限申请',
				 content: '需要系统位置权限,请前往设置开启',
				 confirmText: '去设置',
				 success: (res) => {
				   if (res.confirm) {
					 this.openPhoneSystemSettings();
				   }
				 }
		   });
	       return;
	     }
	   
	// 3. 其他错误(GPS信号弱等)
	console.error("定位失败原因:", err);
	
  },
  openAppPermissionSettings() {
	const platform = uni.getSystemInfoSync().platform;
	
	 if (platform === 'android') {
		  const main = plus.android.runtimeMainActivity();
		  const Intent = plus.android.importClass('android.content.Intent');
		  const Settings = plus.android.importClass('android.provider.Settings');
		  
		  const intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
		  const uri = plus.android.invoke(
			'android.net.Uri',
			'fromParts',
			'package',
			main.getPackageName(),
			null
		  );
		  intent.setData(uri);
		  main.startActivity(intent);
		} else if (platform === 'ios') {
		  const UIApplication = plus.ios.importClass('UIApplication');
		  const application = UIApplication.sharedApplication();
		  const NSURL = plus.ios.importClass('NSURL');
		  const url = NSURL.URLWithString('app-settings:');
		  application.openURL(url);
		}
		
		
  },
  openPhoneSystemSettings() {
	   // android平台
	  if (uni.getSystemInfoSync().platform == 'android') {
		var Intent = plus.android.importClass('android.content.Intent');
		var Settings = plus.android.importClass('android.provider.Settings');
		var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
		var main = plus.android.runtimeMainActivity();
		main.startActivity(intent); // 打开系统设置GPS服务页面
	  }
  
	  // ios平台
	  if (uni.getSystemInfoSync().platform == 'ios') {
		var UIApplication = plus.ios.import("UIApplication");
		var application2 = UIApplication.sharedApplication();
		var NSURL2 = plus.ios.import("NSURL");
		var setting2 = NSURL2.URLWithString("App-Prefs:root=Privacy&path=LOCATION");
		application2.openURL(setting2);
		plus.ios.deleteObject(setting2);
		plus.ios.deleteObject(NSURL2);
		plus.ios.deleteObject(application2);
	  }
  }

deviceJX.js
这里获取app定位权限、系统定位权限 默认判断的是 android 系统 没有考虑ios

// 检查app的定位权限   android 
export async function checkAppLocationPermission() {
  return new Promise(resolve => {
    const main = plus.android.runtimeMainActivity();
    const PackageManager = plus.android.importClass('android.content.pm.PackageManager');
    
    const checkResult = main.checkSelfPermission(
      "android.permission.ACCESS_FINE_LOCATION"
    );
    console.log(checkResult)
    console.log("PackageManager.PERMISSION_GRANTED--"+PackageManager.PERMISSION_GRANTED)
    resolve(checkResult === PackageManager.PERMISSION_GRANTED);
  });
}

// 检查系统定位权限 android 
export async function checkSystemLocationService() {
  const Context = plus.android.importClass('android.content.Context');
  const LocationManager = plus.android.importClass('android.location.LocationManager');
  
  const main = plus.android.runtimeMainActivity();
  const locationManager = main.getSystemService(Context.LOCATION_SERVICE);
  
  return (
    locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || 
    locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
  );
}

### 处理 Uni-app 中的 APP 定位权限 在 Uni-app 开发环境中,处理应用程序的定位权限涉及多个方面。对于 Android 和 iOS 平台而言,确保能够请求并获得用户的地理位置授权至关重要。 #### 权限声明与配置 为了使应用能够在启动用户询问是否授予访问设备位置的权利,在 `manifest` 文件内需指定相应的权限设置[^1]。这不同于传统的微信小程序中的 `app.json` 配置方式;Uni-app 使用的是更统一化的 manifest 结构来定义全局属性和服务端口等信息。 针对 Android 应用来说,还需要特别关注 `AndroidManifest.xml` 的编辑工作,因为某些特定版本可能需要额外的手动干预才能正常运作[^3]。 #### 请求权限逻辑编写 当检测到当前环境不支持自动获取当前位置或是之前被拒绝过该权限,则应该主动引导用户前往系统设置界面手动开启此选项。下面给出了一段 JavaScript 代码片段用于展示如何判断是否有权读取地理坐标数据,并采取适当措施: ```javascript // 判断是否具有定位权限 function checkLocationPermission() { const status = plus.permissions.getPermissions(); if (!status['android.permission.ACCESS_FINE_LOCATION']) { // 如果没有精确定位权限 alert('未获取定位权限'); // 提醒用户去打开权限 plus.runtime.openURL('/system/setting/location'); // 打开系统定位服务开关 return false; } try { uni.getLocation({ type: 'wgs84', success(res) { console.log(`经度:${res.longitude},纬度:${res.latitude}`); }, fail(err) { console.error('获取位置失败', err); // 可能是因为用户关闭了GPS等原因造成的错误 // 此处可以根据实际情况做出相应提示给用户 if (err.errCode === -1 || err.errMsg.indexOf('auth deny') !== -1) { // 用户拒绝授予权限的操作... plus.nativeUI.confirm( "您已拒绝使用定位功能, 是否现在重新开启?", function(index){ if (index == 0){ plus.runtime.openURL("/system/setting/app"); // 跳转至本应用详情页让用户修改权限 }else{ } },'提示' ); } } }); } catch(e) { console.warn('调用getLocation接口异常:', e.message); } } ``` 上述函数首先会检查是否存在必要的权限,如果没有则尝试指导用户完成操作。一旦成功取得许可之后便可以直接调用 `uni.getLocation()` 获取经纬度数值[^2]。 #### 注意事项 - 对于不同操作系统间存在的差异性要有所准备,比如 iOS 上可能会有更多关于隐私保护方面的考量。 - 当遇到因网络状况不佳而导致的服务不可达情况也应给予合理的反馈机制告知使用者具体情况。 - 在设计 UI 流程上尽可能简化步骤减少摩擦成本提高用户体验满意度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值