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)
  );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值