只考虑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)
);
}