利用Native.js获取当前App的授权状态,可打开App的授权设置界面,这里使用已封装好的permission.js插件,实现提示用户授权情况及设置功能。
插件下载地址:App权限判断和提示 - DCloud 插件市场
1.下载插件并存放到项目目录下,比如:js_sdk/wa-permission/permisson.js
2.在页面中引入js模块:
import permission from '@/js_jdk/wa-permission/permission.js'
3.调用模块的方法
//判断IOS上是否给予位置权限,有权限返回true,否则返回false
permission.judgeIosPermission('location');
方法1:Bool permission.judgeIosPermission(String permissionID)
参数说明:
参数名 | 类型 | 必填 | 说明 |
permissionID | String | 是 | ios权限名称,值域清单如下列表 |
permissionID值域清单
参数名 | 说明 |
location | 位置 |
push | 推送(限IOS,注意Android上推送并不是一个权限) |
camera | 摄像头 |
photoLibrary | 相册 |
record | 麦克风 |
contact | 通讯录 |
calendar | 日历 |
memo | 备忘录 |
示例:
//判断IOS上是否给予位置权限,有权限返回true,否则返回false
permission.judgeIosPermission('location');
方法2:await Number permission.requestAndroidPermission(String permissionID)
注意:Android是动态权限,请求权限状态时会触发弹框访问是否赋权(如果已经同意或永久禁止则不会访问),所以必须使用异步方式来处理)
参数说明
参数名 | 类型 | 必填 | 说明 |
permissionID | String | 是 | Android权限名称,值域清单如下表 |
permissionId值域清单
参数名 | 说明 |
android.permission.ACCESS_FINE_LOCATION | 位置权限 |
android.permission.ACCESS_COARSE_LOCATION | 模糊位置权限(蓝牙\ble依赖) |
android.permission.CAMERA | 摄像头权限 |
android.permission.READ_EXTERNAL_STORAGE | 外部存储(含相册)读取权限 |
android.permission.WRITE_EXTERNAL_STORAGE | 外部存储(含相册)定入权限 |
android.permission.RECORD_AUDIO | 麦克风权限 |
android.permission.READ_CONTACTS | 通讯录读取权限 |
android.permission.WRITE_CONTACTS | 通讯录写入权限 |
android.permission.READ_CALENDAR | 日历读取权限 |
android.permission.WRITE_CALENDAR | 日历写入权限 |
android.permission.READ_SMS | 短信读取权限 |
android.permission.SEND_SMS | 短信发送权限 |
android.permission.RECEIVE_SMS | 接收新短信权限 |
android.permission.READ_PHONE_STATE | 获取手机识别码等信息权限 |
android.permission.CALL_PHONE | 拨打电话权限 |
android.permission.READ_CALL_LOG | 获取通话记录权限 |
这里支持Android所有android.permission的值,更多值可参考Android开发文档
返回值值域说明
permission.requestAndroidPermission(permissionID) 返回值为数字,包括-1、0、1这三个值。
返回值 | 说明 |
1 | 已获取授权 |
0 | 未获取授权 |
-1 | 被永久拒绝授权 |
示例:
// vue的method里编写如下代码
async requestAndroidPermission(permissionID) {
var result = await permission.requestAndroidPermission(permissionID)
var strStatus
if (result == 1) {
strStatus = "已获得授权"
} else if (result == 0) {
strStatus = "未获得授权"
} else {
strStatus = "被永久拒绝权限"
}
uni.showModal({
content: permissionID + strStatus,
showCancel: false
});
}
内部已封装,不必区分IOS和Android。
示例代码:
permission.gotoAppPermissionSetting()
注:IOS上如果没有调用过的权限,不会出现在权限设置界面。Android碎版化严重,直接打开了App的设置界面。
内部已封装,不必区分IOS和Android
返回值 | 说明 |
true | 开启 |
false | 关闭 |
示例:
//返回true或false
permission.checkSystemEnableLocation()
Native.js是用js调用原生API的一种写法,示例如下:
判断定位权限是否开启以及手机自身的位置服务是否被关闭
var cllocationManger = plus.ios.import("CLLocationManager");
var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
console.log("enable:" + enable);
console.log("status:" + status);
if (enable && status != 2) {
console.log("手机系统的定位已经打开且App已经获得定位权限");
} else {
console.log("手机系统的定位没有打开或App没有获得定位权限");
}
plus.ios.deleteObject(cllocationManger);
1.判断是否有拨打电话权限,示例如下:
import permission from "@/js_sdk/wa-permission/permission.js"
//检查是否开启通讯录服务
export const checkContect = () => {
return new Promise((resolve, reject) => {
permission.requestAndroidPermission('android.permission.CALL_PHONE').then(res => {
if(res==1){
resolve();
}else if(res == 0){
uni.showModal({
title: '提示',
content: '被永久拒绝授权, 请打开拨打电话权限',
success() {
permission.gotoAppPermissionSetting();
}
});
reject();
}else if(res == -1){
uni.showModal({
title: '提示',
content: '未获取授权, 请打开拨打电话权限',
success() {
permission.gotoAppPermissionSetting();
}
});
reject();
}
}).catch(() => {
uni.showModal({
title: '提示',
content: '请打开拨打电话权限',
success() {
permission.gotoAppPermissionSetting();
}
});
reject();
});
});
}
//通过import将checkContect函数引入调用页面,调用方法如下
// #ifdef APP-PLUS
checkContect().then(() => {
uni.makePhoneCall({
phoneNumber: '手机或座机号码'
});
});
// #endif
2.检查是否开启位置信息服务
import permission from "@/js_sdk/wa-permission/permission.js"
// 检查是否开启位置信息服务
export const checkOpenService = () => {
let result = permission.checkSystemEnableLocation();
if(!result) {
uni.showModal({
title: '提示',
content: '请打开定位服务功能',
showCancel: false,
success() {
var main = plus.android.runtimeMainActivity();
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);
main.startActivity(intent); // 打开系统设置GPS服务页面
}
});
}else {
console.log('已开启定位服务功能');
}
}
//通过import将checkOpenService函数名引入调用页,示例如下
// #ifdef APP-PLUS
let permissionStatus = checkOpenPermission();
if(!permissionStatus){
return false;
}
// #endif
其他权限判断与开启方法,可参考以上示例