定位权限检查
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()
}
})
})
}