328 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			328 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | ||
| 	<view v-if="showPopup" class="uni-popup" :style="{top:isNativeHead?'':StatusBar}" :key="showTitle">
 | ||
| 		<view :class="[type, ani, animation ? 'ani' : '']" class="uni-custom uni-popup__wrapper" @click="close(true)">
 | ||
| 			<view class="uni-popup__wrapper-box">
 | ||
| 				<view class="title">{{showTitle}}</view>
 | ||
| 				<view class="content">{{showContent}}</view>
 | ||
| 			</view>
 | ||
| 		</view>
 | ||
| 	</view>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| 	export default {
 | ||
| 		name: 'YkAuthpup',
 | ||
| 		props: {
 | ||
| 			// 开启动画
 | ||
| 			animation: {
 | ||
| 				type: Boolean,
 | ||
| 				default: true
 | ||
| 			},
 | ||
| 			type: {
 | ||
| 				type: String,
 | ||
| 				default: 'top'
 | ||
| 			},
 | ||
| 			show: {
 | ||
| 				type: Boolean,
 | ||
| 				default: true
 | ||
| 			},
 | ||
| 			//是否是原生头部
 | ||
| 			isNativeHead:{
 | ||
| 				type: Boolean,
 | ||
| 				default: true
 | ||
| 			},
 | ||
| 			permissionID: {
 | ||
| 				type: [String, Number],
 | ||
| 				default: ''
 | ||
| 			}
 | ||
| 		},
 | ||
| 		data() {
 | ||
| 			return {
 | ||
| 				ani: '',
 | ||
| 				showPopup: false,
 | ||
| 				StatusBar:'',
 | ||
| 				refuseNum:'',//拒绝次数,
 | ||
| 				authList: {
 | ||
| 				  'CAMERA': {
 | ||
| 					title: "秦安安全对相机/照片权限申请说明",
 | ||
| 					content: "便于您使用该功能上传您的照片/图片/视频,用于上传隐患、人脸识别与扫描二维码等场景中读取和写入相册和文件内容。"
 | ||
| 				  },
 | ||
| 				  'ACCESS_FINE_LOCATION': {
 | ||
| 					title: "秦安安全对地理位置权限申请说明",
 | ||
| 					content: "秦安安全应用程序可以提供基于位置的服务、定位等功能。",
 | ||
| 				  },
 | ||
| 				  'RECORD_AUDIO': {
 | ||
| 					title: "秦安安全对麦克风权限申请说明",
 | ||
| 					content: "便于您使用该功能进行人脸识别。",
 | ||
| 				  },
 | ||
|           'WRITE_EXTERNAL_STORAGE':{
 | ||
|             title: "秦安安全对相册权限申请说明",
 | ||
|             content: "便于您使用该功能上传您的照片/图片/视频,用于上传图片、视频等场景中读取和写入相册和文件内容。"
 | ||
|           }
 | ||
| 				},
 | ||
|         showTitle:'',
 | ||
|         showContent:'',
 | ||
| 			}
 | ||
| 		},
 | ||
| 		created() {
 | ||
| 			// #ifdef APP-PLUS
 | ||
| 			this.getSystemInfo();
 | ||
| 			// #endif
 | ||
| 		},
 | ||
| 		methods: {
 | ||
| 			//获取状态栏高度
 | ||
| 			getSystemInfo() {
 | ||
| 				let _this = this;
 | ||
| 				uni.getSystemInfo({
 | ||
| 					success: function(e) {
 | ||
| 						_this.StatusBar = e.statusBarHeight + 'px'; //用于自定义头部时,给手机状态栏留出位置,可通过isNativeHead这个参数控制
 | ||
| 					}
 | ||
| 				})
 | ||
| 			},
 | ||
| 			open() {
 | ||
| 				this.requestPermissions(this.permissionID);
 | ||
| 			},
 | ||
| 			close(type) {
 | ||
| 				this.ani = '';
 | ||
| 				this.$nextTick(() => {
 | ||
| 					setTimeout(() => {
 | ||
| 						this.showPopup = false;
 | ||
| 					}, 300)
 | ||
| 				})
 | ||
| 			},
 | ||
| 			//权限检测
 | ||
| 			requestPermissions(permissionID) {
 | ||
| 				let _this = this;
 | ||
| 				// #ifdef APP-PLUS
 | ||
| 				//判断安卓与ios设备
 | ||
| 				if (plus.os.name == 'Android') {
 | ||
|           let _permissionID = 'android.permission.' + permissionID;
 | ||
|           plus.android.checkPermission(_permissionID,
 | ||
|               granted => {
 | ||
|                 if (granted.checkResult == -1) {
 | ||
|                   //还未授权当前查询的权限,打开权限申请目的自定义弹框
 | ||
|                   _this.showPopup = true;
 | ||
|                   _this.$nextTick(() => {
 | ||
|                     setTimeout(() => {
 | ||
|                       _this.showTitle = _this.authList[permissionID].title;
 | ||
|                       _this.showContent = _this.authList[permissionID].content;
 | ||
|                       _this.ani = 'uni-' + _this.type
 | ||
|                     }, 30)
 | ||
|                   })
 | ||
|                 }
 | ||
|               },
 | ||
|               error => {
 | ||
|                 console.log(error.message);
 | ||
|               }
 | ||
|           );
 | ||
|           plus.android.requestPermissions([_permissionID],
 | ||
|               (e) => {
 | ||
|                 console.log(e)
 | ||
|                 //关闭权限申请目的自定义弹框
 | ||
|                 _this.ani = '';
 | ||
|                 _this.$nextTick(() => {
 | ||
|                   setTimeout(() => {
 | ||
|                     _this.showPopup = false
 | ||
|                   }, 0)
 | ||
|                 })
 | ||
|                 if (e.granted.length > 0) {
 | ||
|                   //当前查询权限已授权,此时可以通知页面执行接下来的操作
 | ||
|                   _this.$emit('changeAuth');
 | ||
|                 }
 | ||
|                 if (e.deniedAlways.length > 0) {
 | ||
|                   //当前查询权限已被永久禁用,此时需要引导用户跳转手机系统设置去开启
 | ||
|                   uni.showModal({
 | ||
|                     title: '温馨提示',
 | ||
|                     content: '还没有该权限,立即去设置开启?',
 | ||
|                     cancelText: "取消",
 | ||
|                     confirmText: "去设置",
 | ||
|                     showCancel: true,
 | ||
|                     confirmColor: '#000',
 | ||
|                     cancelColor: '#666',
 | ||
|                     success: (res) => {
 | ||
|                       if (res.confirm) {
 | ||
|                         _this.goSetting();
 | ||
|                       }
 | ||
|                     }
 | ||
|                   })
 | ||
|                 }
 | ||
|               })
 | ||
| 				} else {
 | ||
| 					//IOS不需要添加自定义弹框来描述权限目的,因为在配置文件的隐私信息访问的许可描述里可添加
 | ||
| 					//正常可以直接调用uni的API调起权限询问弹框使用各种权限,下面的判断使用场景主要是在IOS禁用某权限后,这个可以判断有无权限,进而引导用户跳转设置开启,仅列出了位置、相册、通讯录、相机、录音等权限,其他IOS权限可具体参考 https://ext.dcloud.net.cn/plugin?id=15787
 | ||
| 					let result = 0;
 | ||
| 					if (permissionID == 'ACCESS_FINE_LOCATION') {
 | ||
| 						//IOS检测位置权限
 | ||
| 						let cLLocationManager = plus.ios.importClass("CLLocationManager"),
 | ||
| 							authStatus = cLLocationManager.authorizationStatus(),
 | ||
| 							enable = cLLocationManager.locationServicesEnabled();
 | ||
| 						if (enable && authStatus != 2) {
 | ||
| 							result = 1;
 | ||
| 						} else {
 | ||
| 							result = 0;
 | ||
| 						}
 | ||
| 						plus.ios.deleteObject(cLLocationManager);
 | ||
| 					} else if (permissionID == 'WRITE_EXTERNAL_STORAGE') {
 | ||
| 						//IOS检测相册权限
 | ||
| 						let PHPhotoLibrary = plus.ios.importClass("PHPhotoLibrary"),
 | ||
| 							authStatus = PHPhotoLibrary.authorizationStatus();
 | ||
| 						if (authStatus === 3) {
 | ||
| 							result = 1;
 | ||
| 						} else {
 | ||
| 							result = 0;
 | ||
| 						}
 | ||
| 						plus.ios.deleteObject(PHPhotoLibrary);
 | ||
| 					} else if (permissionID == 'CAMERA') {
 | ||
| 						//IOS检测相机/摄像头权限
 | ||
| 						// let avCaptureDevice = plus.ios.importClass("AVCaptureDevice"),
 | ||
| 						//     authStatus = avCaptureDevice.authorizationStatusForMediaType("vide");
 | ||
| 						// if (authStatus === 3) {
 | ||
| 						  result = 1;
 | ||
| 						// } else {
 | ||
| 						//   result = 0;
 | ||
| 						// }
 | ||
| 						// plus.ios.deleteObject(avCaptureDevice);
 | ||
| 					} else if (permissionID == 'CALL_PHONE') {
 | ||
| 						//IOS检测通讯录权限
 | ||
| 						let contactStore = plus.ios.importClass("CNContactStore"),
 | ||
| 							authStatus = contactStore.authorizationStatusForEntityType(0);
 | ||
| 						if (authStatus === 3) {
 | ||
| 							result = 1;
 | ||
| 						} else {
 | ||
| 							result = 0;
 | ||
| 						}
 | ||
| 						plus.ios.deleteObject(contactStore);
 | ||
| 					}else if(permissionID == 'RECORD_AUDIO'){
 | ||
| 						//IOS检测麦克风权限
 | ||
| 						let aVAudioSession = plus.ios.importClass("AVAudioSession"),
 | ||
| 						  aVAudio = aVAudioSession.sharedInstance(),
 | ||
| 						  authStatus = aVAudio.recordPermission();
 | ||
| 						if ([1684369017, 1970168948].includes(authStatus)) {
 | ||
| 						  result = 0;
 | ||
| 						} else {
 | ||
| 						  result = 1;
 | ||
| 						}
 | ||
| 						plus.ios.deleteObject(aVAudioSession);
 | ||
| 					}
 | ||
| 					if (result) {
 | ||
| 						//当前查询权限已授权,此时可以通知页面执行接下来的操作
 | ||
| 						console.log("result")
 | ||
| 						_this.$emit('changeAuth')
 | ||
| 					} else {
 | ||
| 						//当前查询的权限已禁用,引导用户跳转手机系统设置去开启
 | ||
| 						uni.showModal({
 | ||
| 							title: '温馨提示',
 | ||
| 							content: '还没有该权限,立即去设置开启?',
 | ||
| 							cancelText: "取消",
 | ||
| 							confirmText: "去设置",
 | ||
| 							showCancel: true,
 | ||
| 							confirmColor: '#000',
 | ||
| 							cancelColor: '#666',
 | ||
| 							success: (res) => {
 | ||
| 								if (res.confirm) {
 | ||
| 									_this.goSetting();
 | ||
| 								}
 | ||
| 							}
 | ||
| 						})
 | ||
| 					}
 | ||
| 				}
 | ||
| 				// #endif
 | ||
| 			},
 | ||
| 			//跳转手机系统设置
 | ||
| 			goSetting() {
 | ||
| 				if (plus.os.name == "iOS") {
 | ||
| 					var UIApplication = plus.ios.import("UIApplication");
 | ||
| 					var application2 = UIApplication.sharedApplication();
 | ||
| 					var NSURL2 = plus.ios.import("NSURL");
 | ||
| 					var setting2 = NSURL2.URLWithString("app-settings:");
 | ||
| 					application2.openURL(setting2);
 | ||
| 					plus.ios.deleteObject(setting2);
 | ||
| 					plus.ios.deleteObject(NSURL2);
 | ||
| 					plus.ios.deleteObject(application2);
 | ||
| 				} else {
 | ||
| 					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);
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| </script>
 | ||
| <style lang="scss">
 | ||
| 	.uni-popup {
 | ||
| 		position: fixed;
 | ||
| 		top: var(--status-bar-height);
 | ||
| 		bottom: 0;
 | ||
| 		left: 0;
 | ||
| 		right: 0;
 | ||
| 		z-index: 99999;
 | ||
| 		overflow: hidden;
 | ||
| 		&__wrapper {
 | ||
| 			position: absolute;
 | ||
| 			z-index: 999;
 | ||
| 			/* #ifndef APP-NVUE */
 | ||
| 			box-sizing: border-box;
 | ||
| 			/* #endif */
 | ||
| 			&.ani {
 | ||
| 				/* #ifndef APP-NVUE */
 | ||
| 				transition: all 0.3s;
 | ||
| 				/* #endif */
 | ||
| 			}
 | ||
| 			&.top {
 | ||
| 				top: 0;
 | ||
| 				width:705rpx;
 | ||
| 				/* #ifdef APP-NVUE */
 | ||
| 				left:22.5rpx;
 | ||
| 				/* #endif */
 | ||
| 				/* #ifndef APP-NVUE */
 | ||
| 				left:0;
 | ||
| 				transform: translateY(-705rpx);
 | ||
| 				/* #endif */
 | ||
| 			}
 | ||
| 			&-box {
 | ||
| 				position: relative;
 | ||
| 				/* #ifndef APP-NVUE */
 | ||
| 				box-sizing: border-box;
 | ||
| 				/* #endif */
 | ||
| 			}
 | ||
| 			&.uni-custom {
 | ||
| 				& .uni-popup__wrapper-box {
 | ||
| 					width: 705rpx;
 | ||
| 					/* #ifndef APP-NVUE */
 | ||
| 					margin: 0 22.5rpx;
 | ||
| 					/* #endif */
 | ||
| 					padding: 30upx;
 | ||
| 					background: #fff;
 | ||
| 					border: solid 2rpx #ddd;
 | ||
| 					/* #ifndef APP-NVUE */
 | ||
| 					box-sizing: border-box;
 | ||
| 					/* #endif */
 | ||
| 					border-radius: 16rpx;
 | ||
| 					.title{
 | ||
| 						font-size: 32rpx;
 | ||
| 						font-weight: bold;
 | ||
| 					}
 | ||
| 					.content{
 | ||
| 						margin-top: 16rpx;
 | ||
| 						line-height: 1.6;
 | ||
| 					}
 | ||
| 				}
 | ||
| 				&.top{
 | ||
| 					& .uni-popup__wrapper-box {
 | ||
| 						width: 705rpx;
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			&.uni-top{
 | ||
| 				transform: translateY(0);
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| </style>
 |