2***@qq.com
2***@qq.com
  • 发布:2019-08-13 09:29
  • 更新:2021-03-11 09:51
  • 阅读:9931

android ios 权限检查与动态申请提示

分类:Native.js

ios 就这个个性,应用第一次用权限时,比如 相机 权限,检查的话是不存在的!就算打开 应用的权限页面 也没用,因为里面没有 相机 权限...,算了,不多说了,怀疑自己个儿抑郁了....直接发代码了,在逻辑上很可能不完善,还望懂行的道友...


    /**  
     * 获取系统权限  
     * @param {Object} permission       权限标识  
     *      CAMERA: (String 类型 )访问摄像头权限         用于调用摄像头(plus.camera.* plus.barcode.*)  
     *      CONTACTS: (String 类型 )访问系统联系人权限     用于访问(读、写)系统通讯录(plus.gallery.*)  
     *      GALLERY: (String 类型 )访问系统相册权限       用于访问(读、写)系统相册(plus.gallery.*)  
     *      LOCATION: (String 类型 )定位权限              用于获取当前用户位置信息(plus.geolocation.*)  
     *      NOTIFITION: (String 类型 )消息通知权限      用于接收系统消息通知(plus.push.*)  
     *      RECORD: (String 类型 )录音权限                用于进行本地录音操作(plus.audio.AudioRecorder)  
     *      SHORTCUT: (String 类型 )创建桌面快捷方式权限    用于在系统桌面创建快捷方式图标(plus.navigator.createShortcut)  
     *   
     * @param {Object} successCallBack  成功回调  
     * @param {Object} errorCallBack    失败回调  
     */  
function getPermission(permissionIdentity, successCallBack, errorCallBack){  
        //权限标识转换成大写  
        var permissionIdentity = permissionIdentity.toUpperCase();  
        //获取检测权限的状态  
        var checkResult = plus.navigator.checkPermission(permissionIdentity);  
        //权限状态是否正常  
        var permissionStatusOk = false;  
        //权限中文名称  
        var permissionName = '';  
        //对应 andorid 的具体权限  
        var androidPermission = '';  
        //获取权限中文意思与对应 android 系统的权限字符串  
        switch (permissionIdentity) {  
            case 'CAMERA':  
                permissionName = '摄像头';  
                androidPermission = 'android.permission.CAMERA';  
                break;  
            case 'CONTACTS':  
                permissionName = '系统联系人';  
                androidPermission = 'android.permission.READ_CONTACTS'  
                break;  
            case 'GALLERY':  
                permissionName = '系统相册';  
                androidPermission = 'android.permission.READ_EXTERNAL_STORAGE';  
                break;  
            case 'LOCATION':  
                permissionName = '定位';  
                androidPermission = 'android.permission.ACCESS_COARSE_LOCATION';  
                break;  
            case 'NOTIFITION':  
                permissionName = '消息通知';  
                androidPermission = '消息通知';  
                break;  
            case 'RECORD':  
                permissionName = '录音';  
                androidPermission = 'android.permission.RECORD_AUDIO';  
                break;  
            case 'SHORTCUT':  
                permissionName = '创建桌面快捷方式';  
                androidPermission = 'com.android.launcher.permission.INSTALL_SHORTCUT';  
                break;  
            default:  
                permissionName = '未知';  
                androidPermission = '未知';  
                break;  
        }  

        //判断检查权限的结果  
        switch (checkResult) {  
            case 'authorized':  
                //正常的  
                permissionStatusOk = true  
                break;  
            case 'denied':  
                //表示程序已被用户拒绝使用此权限,如果是拒绝的就再次提示用户打开确认提示框  
                //如果有该权限但是没有打开不进行操作还是会去申请或手动打开  
                // console.log('已关闭' + permissionName + '权限')  
                // errorCallBack('已关闭' + permissionName + '权限');  
                // return  
                break;  
            case 'undetermined':  
                // 表示程序未确定是否可使用此权限,此时调用对应的API时系统会弹出提示框让用户确认  
                // this.requestPermissions(androidPermission, permissionName, successCallBack, errorCallBack)  
                // errorCallBack('未确定' + permissionName + '权限');  
                // return  
                break;  
            case 'unknown':  
                errorCallBack('无法查询' + permissionName + '权限');  
                return  
                break;  
            default:  
                errorCallBack('不支持' + permissionName + '权限');  
                return  
                break;  
        }  

        //如果权限是正常的执行成功回调  
        if (permissionStatusOk) {  
            successCallBack()  
        } else {  
            //如果不正常,如果是 andorid 系统,就动态申请权限  
            if (plus.os.name == 'Android') {  
                //动态申请权限  
                plus.android.requestPermissions([androidPermission], function(e) {  
                    if (e.deniedAlways.length > 0) {  
                        //权限被永久拒绝  
                        // 弹出提示框解释为何需要定位权限,引导用户打开设置页面开启  
                        errorCallBack(permissionName + ' 权限被永久拒绝,请到设置权限里找到应用手动开启权限,否则将不能使用此功能。')  
                        // console.log('Always Denied!!! ' + e.deniedAlways.toString());  
                    }  
                    if (e.deniedPresent.length > 0) {  
                        //权限被临时拒绝  
                        // 弹出提示框解释为何需要定位权限,可再次调用plus.android.requestPermissions申请权限  
                        errorCallBack('拒绝开启 ' + permissionName + ' 权限,将不能使用此功能!')  
                        // console.log('Present Denied!!! ' + e.deniedPresent.toString());  
                    }  
                    if (e.granted.length > 0) {  
                        //权限被允许  
                        //调用依赖获取定位权限的代码  
                        successCallBack()  
                        // console.log('Granted!!! ' + e.granted.toString());  
                    }  
                }, function(e) {  
                    errorCallBack('请求 ' + permissionName + ' 权限失败,' + +JSON.stringify(e))  
                    // console.log('Request Permissions error:' + JSON.stringify(e));  
                })  
            } else if (plus.os.name == 'iOS') {  
                //ios ,第一次使用目的权限时,应用的权限列表里是不存在的,所以先默认执行一下成功回调,打开要使用的操作,比如 plus.camera  
                //这时系统会提示是否打开相应的权限,如果拒绝也没关系,因为应用的权限列表里已经存在该权限了,下次再调用相应权限时,就会  
                //走 else 里的流程,会给用户提示,并且跳转到应该的权限页面,让用户手动打开。  
                if (checkResult == 'undetermined') {  
                    //调用依赖获取定位权限的代码  
                    successCallBack(true)  
                } else {  
                    //如果是 ios 系统,ios 没有动态申请操作,所以提示用户去设置页面手动打开  
                    mui.confirm(permissionName + ' 权限没有开启,是否去开启?', '提醒', ['取消', '确认'], function(e) {  
                        //取消  
                        if (e.index == 0) {  
                            errorCallBack('拒绝开启 ' + permissionName + ' 权限,将不能使用此功能!')  
                        } else if (e.index == 1) {  
                            //确认,打开当前应用权限设置页面  
                            var UIApplication = plus.ios.import('UIApplication');  
                            var application2 = UIApplication.sharedApplication();  
                            var NSURL2 = plus.ios.import('NSURL');  
                            // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");                             
                            var setting2 = NSURL2.URLWithString('app-settings:');  
                            application2.openURL(setting2);  

                            plus.ios.deleteObject(setting2);  
                            plus.ios.deleteObject(NSURL2);  
                            plus.ios.deleteObject(application2)  
                        }  
                    }, 'div')  
                }  
            }  
        }  
}

代码使用示例:
//先动态申请权限
getPermission('CAMERA', function() {
/拍照/
that._takePhoto()
}, function(msg) {
mui.alert(msg, '提醒', '确定', function() {}, 'div')
})
传参传注释里的大写。
涛声依旧吧,先这么着,有问题大家伙讨论。

9 关注 分享
诺墨 9***@qq.com HansChen 9***@qq.com 2***@qq.com 3***@qq.com rysnone 严肃脸 FE_liyangyang

要回复文章请先登录注册

邢牧

邢牧

应用权限页面打不开
2021-03-11 09:51
太2真人

太2真人

回复 天才第一步 :
然后呢。大哥,怎么解决的
2020-10-16 16:00
天才第一步

天才第一步

兄弟这个不适用安卓啊,文档都写了,

PermissionNames
运行环境权限类型

常量:
CAMERA: (String 类型 )访问摄像头权限
用于调用摄像头(plus.camera.*/plus.barcode.*)。

平台支持
Android - ALL (不支持) :
暂不支持,返回“unsupported”。

iOS - ALL (支持)
CONTACTS: (String 类型 )访问系统联系人权限
用于访问(读、写)系统通讯录(plus.gallery.*)。

平台支持
Android - ALL (不支持) :
暂不支持,返回“unsupported”。
。。。。。。。
2020-06-23 09:40
2***@qq.com

2***@qq.com (作者)

回复 7***@qq.com :
plus.ios.import,好像没有 Class
2020-05-28 10:48
7***@qq.com

7***@qq.com

请问一下,这个 plus.ios.importClass 需不需要配置什么,我写的时候, 总是 null
2020-05-09 17:15
9***@qq.com

9***@qq.com

哈哈
2019-12-05 19:15
4***@qq.com

4***@qq.com

permissionName = '消息通知';
androidPermission = '消息通知'; 安卓对应的名字就叫消息通知?
2019-12-05 18:46
老哥教教我

老哥教教我

安卓怎么鉴定权限是否被禁
2019-11-03 05:26
2***@qq.com

2***@qq.com (作者)

回复 h***@163.com :
okokokok
2019-08-30 16:30
h***@163.com

h***@163.com

回复 2***@qq.com :
谢谢, 找到原因了, ios工程得在info.plist里添加相册权限,不然就会崩溃
2019-08-30 16:21