定位权限检查
export const checkPermission = () => {const platform = uni.getSystemInfoSync().platform;console.log('platform', platform)if (platform === 'android') {return checkAndroidPermission();} else if (platform === 'ios') {return checkIOSPermission();}
};
export const checkAndroidPermission = () => {return new Promise((resolve) => {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;}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());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: console.log('始终允许定位');resolve(1);break;case 4: console.log('仅允许前台定位');resolve(1);break;case 1: console.log('已拒绝但可再次请求');resolve(1);break;case 2: console.log('已永久拒绝需手动设置');resolve(2);break;default:console.log('其他状态', mode);}} else {console.log("Android 权限始终允许")resolve(1);}});
}
export const checkIOSPermission = () => {console.log('iOS 检测权限');return new Promise((resolve, reject) => {const cllocationManger = plus.ios.import('CLLocationManager');const status = cllocationManger.authorizationStatus();const enable = cllocationManger.locationServicesEnabled();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);});
};
export const getAndroidLocation = () => {return new Promise((resolve, reject) => {plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'],(result) => {console.log('android,', result);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) {checkPermission().then(async code => {uni.setStorageSync("locationPermissions", true);console.log("code", code)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()}})})}