关于华为应用市场上架,申请权限未告知目的被驳回问题的简单处理方式

关于华为应用市场上架过程中出现的【您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(存储、拍照)等权限,不符合华为应用市场审核标准。】

使用方式:

1、引入

import permision from "@/mixin/permission.js"

2、判断

var result = await permision.premissionCheck("EXTERNAL_STORAGE")  
if(result == 1) {  
    // 此处处理各自业务 如:uni.chooseImage  
}

3、permission.js源码参考如下

var isIos  
// #ifdef APP-PLUS  
isIos = (plus.os.name == "iOS")  
// #endif  

// 判断推送权限是否开启  
function judgeIosPermissionPush() {  
    var result = false;  
    var UIApplication = plus.ios.import("UIApplication");  
    var app = UIApplication.sharedApplication();  
    var enabledTypes = 0;  
    if (app.currentUserNotificationSettings) {  
        var settings = app.currentUserNotificationSettings();  
        enabledTypes = settings.plusGetAttribute("types");  
        console.log("enabledTypes1:" + enabledTypes);  
        if (enabledTypes == 0) {  
            console.log("推送权限没有开启");  
        } else {  
            result = true;  
            console.log("已经开启推送功能!")  
        }  
        plus.ios.deleteObject(settings);  
    } else {  
        enabledTypes = app.enabledRemoteNotificationTypes();  
        if (enabledTypes == 0) {  
            console.log("推送权限没有开启!");  
        } else {  
            result = true;  
            console.log("已经开启推送功能!")  
        }  
        console.log("enabledTypes2:" + enabledTypes);  
    }  
    plus.ios.deleteObject(app);  
    plus.ios.deleteObject(UIApplication);  
    return result;  
}  

// 判断定位权限是否开启  
function judgeIosPermissionLocation() {  
    var result = false;  
    var cllocationManger = plus.ios.import("CLLocationManager");  
    var status = cllocationManger.authorizationStatus();  
    result = (status != 2)  
    console.log("定位权限开启:" + result);  
    // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation  
    /* var enable = cllocationManger.locationServicesEnabled();  
    var status = cllocationManger.authorizationStatus();  
    console.log("enable:" + enable);  
    console.log("status:" + status);  
    if (enable && status != 2) {  
        result = true;  
        console.log("手机定位服务已开启且已授予定位权限");  
    } else {  
        console.log("手机系统的定位没有打开或未给予定位权限");  
    } */  
    plus.ios.deleteObject(cllocationManger);  
    return result;  
}  

// 判断麦克风权限是否开启  
function judgeIosPermissionRecord() {  
    var result = false;  
    var avaudiosession = plus.ios.import("AVAudioSession");  
    var avaudio = avaudiosession.sharedInstance();  
    var permissionStatus = avaudio.recordPermission();  
    console.log("permissionStatus:" + permissionStatus);  
    if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {  
        console.log("麦克风权限没有开启");  
    } else {  
        result = true;  
        console.log("麦克风权限已经开启");  
    }  
    plus.ios.deleteObject(avaudiosession);  
    return result;  
}  

// 判断相机权限是否开启  
function judgeIosPermissionCamera() {  
    var result = false;  
    var AVCaptureDevice = plus.ios.import("AVCaptureDevice");  
    var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');  
    console.log("authStatus:" + authStatus);  
    if (authStatus == 3) {  
        result = true;  
        console.log("相机权限已经开启");  
    } else {  
        console.log("相机权限没有开启");  
    }  
    plus.ios.deleteObject(AVCaptureDevice);  
    return result;  
}  

// 判断相册权限是否开启  
function judgeIosPermissionPhotoLibrary() {  
    var result = false;  
    var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");  
    var authStatus = PHPhotoLibrary.authorizationStatus();  
    console.log("authStatus:" + authStatus);  
    if (authStatus == 3) {  
        result = true;  
        console.log("相册权限已经开启");  
    } else {  
        console.log("相册权限没有开启");  
    }  
    plus.ios.deleteObject(PHPhotoLibrary);  
    return result;  
}  

// 判断通讯录权限是否开启  
function judgeIosPermissionContact() {  
    var result = false;  
    var CNContactStore = plus.ios.import("CNContactStore");  
    var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);  
    if (cnAuthStatus == 3) {  
        result = true;  
        console.log("通讯录权限已经开启");  
    } else {  
        console.log("通讯录权限没有开启");  
    }  
    plus.ios.deleteObject(CNContactStore);  
    return result;  
}  

// 判断日历权限是否开启  
function judgeIosPermissionCalendar() {  
    var result = false;  
    var EKEventStore = plus.ios.import("EKEventStore");  
    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);  
    if (ekAuthStatus == 3) {  
        result = true;  
        console.log("日历权限已经开启");  
    } else {  
        console.log("日历权限没有开启");  
    }  
    plus.ios.deleteObject(EKEventStore);  
    return result;  
}  

// 判断备忘录权限是否开启  
function judgeIosPermissionMemo() {  
    var result = false;  
    var EKEventStore = plus.ios.import("EKEventStore");  
    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);  
    if (ekAuthStatus == 3) {  
        result = true;  
        console.log("备忘录权限已经开启");  
    } else {  
        console.log("备忘录权限没有开启");  
    }  
    plus.ios.deleteObject(EKEventStore);  
    return result;  
}  

// Android权限查询  
function requestAndroidPermission(permissionID) {  
    return new Promise((resolve, reject) => {  
        plus.android.requestPermissions(  
            permissionID.split(","),  
            // [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装  
            function(resultObj) {  
                var result = 0;  
                for (var i = 0; i < resultObj.granted.length; i++) {  
                    var grantedPermission = resultObj.granted[i];  
                    console.log('已获取的权限:' + grantedPermission);  
                    result = 1  
                }  
                for (var i = 0; i < resultObj.deniedPresent.length; i++) {  
                    var deniedPresentPermission = resultObj.deniedPresent[i];  
                    console.log('拒绝本次申请的权限:' + deniedPresentPermission);  
                    result = 0  
                }  
                for (var i = 0; i < resultObj.deniedAlways.length; i++) {  
                    var deniedAlwaysPermission = resultObj.deniedAlways[i];  
                    console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);  
                    result = -1  
                }  
                resolve(result);  
                // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限  
                // if (result != 1) {  
                // gotoAppPermissionSetting()  
                // }  
            },  
            function(error) {  
                console.log('申请权限错误:' + error.code + " = " + error.message);  
                resolve({  
                    code: error.code,  
                    message: error.message  
                });  
            }  
        );  
    });  
}  

// 使用一个方法,根据参数判断权限  
function judgeIosPermission(permissionID) {  
    if (permissionID == "location") {  
        return judgeIosPermissionLocation()  
    } else if (permissionID == "camera") {  
        return judgeIosPermissionCamera()  
    } else if (permissionID == "photoLibrary") {  
        return judgeIosPermissionPhotoLibrary()  
    } else if (permissionID == "record") {  
        return judgeIosPermissionRecord()  
    } else if (permissionID == "push") {  
        return judgeIosPermissionPush()  
    } else if (permissionID == "contact") {  
        return judgeIosPermissionContact()  
    } else if (permissionID == "calendar") {  
        return judgeIosPermissionCalendar()  
    } else if (permissionID == "memo") {  
        return judgeIosPermissionMemo()  
    }  
    return false;  
}  

// 跳转到**应用**的权限页面  
function gotoAppPermissionSetting() {  
    if (isIos) {  
        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);  
    } else {  
        // console.log(plus.device.vendor);  
        var Intent = plus.android.importClass("android.content.Intent");  
        var Settings = plus.android.importClass("android.provider.Settings");  
        var Uri = plus.android.importClass("android.net.Uri");  
        var mainActivity = plus.android.runtimeMainActivity();  
        var intent = new Intent();  
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
        var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);  
        intent.setData(uri);  
        mainActivity.startActivity(intent);  
    }  
}  

// 检查系统的设备服务是否开启  
// var checkSystemEnableLocation = async function () {  
function checkSystemEnableLocation() {  
    if (isIos) {  
        var result = false;  
        var cllocationManger = plus.ios.import("CLLocationManager");  
        var result = cllocationManger.locationServicesEnabled();  
        console.log("系统定位开启:" + result);  
        plus.ios.deleteObject(cllocationManger);  
        return result;  
    } else {  
        var context = plus.android.importClass("android.content.Context");  
        var locationManager = plus.android.importClass("android.location.LocationManager");  
        var main = plus.android.runtimeMainActivity();  
        var mainSvr = main.getSystemService(context.LOCATION_SERVICE);  
        var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);  
        console.log("系统定位开启:" + result);  
        return result  
    }  
}  

let permissionMap = {  
    "android": {  
        "CAMERA_EXTERNAL_STORAGE": {  
            "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE,android.permission.CAMERA",  
            "title": "相机/相册权限说明",  
            "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、与客服沟通等场景中读取和写入相册和文件内容"  
        },  
        "CAMERA": {  
            "name": "android.permission.CAMERA",  
            "title": "相机权限说明",  
            "content": "便于您使用该功能上传图片,用于与客服沟通等场景中发送拍摄图片"  
        },  
        "EXTERNAL_STORAGE": {  
            "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE",  
            "title": "相册权限说明",  
            "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、与客服沟通等场景中读取和写入相册和文件内容"  
        }  
    },  
    "ios": {}  
}  

let view = null;  

function showViewDesc(permission) {  
    let plat = isIos ? "ios" : "android";  
    view = new plus.nativeObj.View('per-modal', {  
        top: '0px',  
        left: '0px',  
        width: '100%',  
        backgroundColor: 'rgba(0,0,0,0.2)',  
        //opacity: '.9'     
    })  
    view.drawRect({  
        color: '#fff',  
        radius: '5px'  
    }, {  
        top: '30px',  
        left: '5%',  
        width: '90%',  
        height: "100px",  
    })  
    view.drawText(permissionMap[plat][permission]["title"], {  
        top: '40px',  
        left: "8%",  
        height: "30px"  
    }, {  
        align: "left",  
        color: "#000",  
    }, {  
        onClick: function(e) {  
            console.log(e);  
        }  
    })  
    view.drawText(permissionMap[plat][permission]["content"], {  
        top: '65px',  
        height: "60px",  
        left: "8%",  
        width: "84%"  
    }, {  
        whiteSpace: 'normal',  
        size: "14px",  
        align: "left",  
        color: "#656563"  
    })  
    view.show()  
}  

function premissionCheck(permission) {  
    return new Promise(async (resolve, reject) => {  
        let plat = isIos ? "ios" : "android";  
        if (isIos) { // ios  
            // const camera = permission.judgeIosPermission("camera");//判断ios是否给予摄像头权限  
            // //ios相册没权限,系统会自动弹出授权框  
            // //let photoLibrary = permission.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限  
            // if(camera){  
            //     resolve();  
            // }else{  
            //     reject('需要开启相机使用权限');  
            // }  
            resolve(1)  
        } else { // android  
            let permission_arr = permissionMap[plat][permission]["name"].split(",");  
            let flag = true;  
            for(let i = 0;i<permission_arr.length;i++) {  
                let status = plus.navigator.checkPermission(permission_arr[i]);  
                if(status == "undetermined") {  
                    flag = false;  
                }  
            }  
            console.log("flag", flag)  
            if (flag == false) { // 未完全授权  
                showViewDesc(permission);  
                requestAndroidPermission(permissionMap[plat][permission]["name"]).then((res) => {  
                    view.close();  
                    if (res == -1) {  
                        uni.showModal({  
                            title: '提示',  
                            content: '操作权限已被拒绝,请手动前往设置',  
                            confirmText: "立即设置",  
                            success: (res) => {  
                                if (res.confirm) {  
                                    gotoAppPermissionSetting()  
                                }  
                            }  
                        })  
                    }  
                    resolve(res)  
                })  
            } else {  
                resolve(1)  
            }  
        }  
    })  
}  

module.exports = {  
    judgeIosPermission: judgeIosPermission,  
    requestAndroidPermission: requestAndroidPermission,  
    checkSystemEnableLocation: checkSystemEnableLocation,  
    gotoAppPermissionSetting: gotoAppPermissionSetting,  
    premissionCheck: premissionCheck  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

paddle环境安装

一、paddle环境安装 如pytorch环境安装一样&#xff0c;首先在base环境下创建一个新的环境来安装paddlepaddle框架。首先创建一个新的环境名叫paddle。执行如下命令。 conda create -n paddle python3.8创建好了名叫paddle这个环境以后&#xff0c;进入到这个环境中&#xff…

【Java 数据结构】排序

排序算法 1. 排序的概念及引用1.1 排序的概念1.2 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序2.3.3 快速排序非递归 2.4 归并排…

【Linux C | 网络编程】netstat 命令图文详解 | 查看网络连接、查看路由表、查看统计数据

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

rust gui开发框架选择

作为一个系统编程强大语言&#xff0c;怎么能少得了图形界面的开发 实际上写这篇前我也不知道&#xff0c;于是我问了ai大模型&#xff0c;文心3.5和chatgpt4.0 答案实际上不能满意&#xff0c;最后我做了下筛选 参考博文&#xff1a; rust开发环境配置&#xff1a;链接 一、…

如何选择最适合的服务器

许多朋友想做一些网站&#xff0c;应用&#xff0c;游戏&#xff0c;小程序等等&#xff0c;都需要接触一个基础&#xff0c;就是服务器。服务器相当于一台24小时不关机的联网电脑&#xff0c;浏览网页或者应用相当于用户在访问这台电脑里的文件。那么如何选择最适合自己的服务…

[C++]类和对象(中)

一:类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中并不是什么都没有&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为…

Android Studio非UI线程修改控件——定时器软件

目录 一、UI界面设计 1、UI样式 2、XML代码 二、功能编写 1、定义 2、实现方法 3、功能实现 一、UI界面设计 1、UI样式 2、XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android…

Interpolator:在Android中方便使用一些常见的CubicBezier贝塞尔曲线动画效果

说明 方便在Android中使用Interpolator一些常见的CubicBezier贝塞尔曲线动画效果。 示意图如下 import android.view.animation.Interpolator import androidx.core.view.animation.PathInterpolatorCompat/*** 参考* android https://yisibl.github.io/cubic-bezier* 实现常…

【AI数字人-论文】Geneface论文

文章目录 前言pipelineaudio-to-motionMotion domain adaptation可视化 Motion-to-imageHead-NeRFTorso-NeRF 结果对比 前言 语音驱动的说话人视频合成旨在根据一段输入的语音&#xff0c;合成对应的目标人脸说话视频。高质量的说话人视频需要满足两个目标&#xff1a; &#…

算法基础,一维,二维前缀和差分详解

目录 1.前缀和 1.一维前缀和 例题&#xff1a;【模板】前缀和 2.二维前缀和 例题&#xff1a;【模板】二维前缀和 2.差分 1.一维差分 1.性质&#xff1a;d[i]的前缀和等于a[i] 2.性质&#xff1a;后缀区间修改 例题&#xff1a;【模板】差分 2.二维差分 例题&#x…

[.NET] 查询当前已安装所有 Win32 与 UWP 应用

为了获取当前设备用户已安装的所有应用程序, 一般来讲有两种方案. 一种是通过查询 “shell:AppsFolder” 目录下所有项, 一种是从开始菜单中获取所有快捷方式, 然后加上查询所有已安装的 UWP 应用, 最后得到总列表. 如需代码参考, 请看 github.com/SlimeNull/WindowsAppsQuery …

Opencv(C++)学习 之RV1126平台的OPENCV交叉编译

本文特点&#xff1a;网上已经有了很多opencv移植RV1106的文章&#xff0c;本文主要记录基于cmake-gui编译&#xff0c;碰到的报错&#xff0c;及解决报错问题的方法&#xff0c;同时简单总结一些配置项相关的知识。 一、环境&#xff1a; ubuntu18 x64 RV1126交叉编译工具链 …

用HTML5 + JavaScript实现下雪效果

用HTML5 JavaScript实现下雪效果 下面是用HTML5 JavaScript实现下雪效果示例&#xff0c;展示了如何使用 HTML5 的 <canvas> 元素以及 JavaScript 来创建下雪效果。效果如下&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html lang"en">…

逸学区块链【solidity】真随机数

参考Get a Random Number | Chainlink Documentation 但是很贵&#xff0c;价格 Gas Price&#xff1a;当前gas价格&#xff0c;根据网络状况而波动。Callback gas &#xff1a;返回您所请求的随机值时&#xff0c;回调请求消耗的gas 量。验证gas &#xff1a;量gas 用于验证…

应用层协议 ——— HTTP协议

应用层协议 ——— HTTP协议 HTTP简介认识URL二、登录信息三、服务器地址四、服务器端口号五、带层次的文件路径六、查询字符串七、片段标识符urlencode和urldecodeHTTP协议格式HTTP请求协议格式HTTP的方法HTTP的状态码HTTP常见的HeaderHTTPS VS HTTP对称加密 VS 非对称加密 HT…

Unity | YooAssetV2.1.0 + HybridCLR热更新

目录 一、项目更改 二、使用YooAsset热更 1.资源配置 2.资源构建 3.将两个文件夹下的资源上传CDN服务器 4.修改代码 5.运行效果 本文记录利用YooAssetHybridCLR来进行资源和dll的更新。YooAsset使用的是新版V2.1.0。相比于旧版&#xff0c;dll(原生文件)和资源要建两个p…

zabbix添加主机

zabbix添加主机 查看ip地址 [rootershi ~]# yum -y install net-tools [rootershi ~]# ifconfig eth0 |grep netmask |cut -d " " -f 10 192.168.88.20被监控主机安装zabbix-agent [root20 ~]# mount /dev/cdrom /mnt [root20 ~]# yum -y install wget [root20 ~]…

conda虚拟环境基础

【一文搞定最新版Anaconda】Win11 安装 Anaconda&#xff08;2023.9&#xff09;详解&#xff08;不删除旧版情况下下载、安装、注册、登录、设置环境变量、迁移旧环境、配置修改换源等&#xff09;连接Pycharm_win11安装anaconda-CSDN博客 conda命令大全&#xff08;create/in…

消息总线在微服务中的应用

直连式配置中心 上一篇文章介绍了 Spring Cloud 中的分布式配置组件 Config&#xff0c;每个服务节点可以从Config Server 拉取外部配置信息。但是似乎还有一个悬而未决的问题&#xff0c;那就是当服务节点数量非常庞大的时候&#xff0c;我们不可能一台一台服务器挨个去手工触…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(四)NodeJS入门——网络基础概念

041_网络基础概念_IP的介绍 hello&#xff0c;大家好&#xff0c;我们来一起认识一下IP。 在开始介绍 IP 之前&#xff0c;我们首先来介绍一个场景&#xff0c;方便大家去理解 IP 这个概念。比如这会儿强哥正在成都&#xff0c;然后还有另外一个小伙伴&#xff0c;谁呢&#x…