uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题

这篇具有很好参考价值的文章主要介绍了uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序自定义相机


效果

uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题

uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题
uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题


需求

uni.chooseMedia可以拉起手机自带相机,但是特殊情况下需要给相机加框和辅助线,比如相机身份证辅助框,这时就会用到uni-app的camera组件,使用 cover-view cover-image 覆盖在上面,实现相机辅助框的效果


一、小程序自定义相机

1.使用uniapp的camera组件

camera组件链接地址:https://uniapp.dcloud.net.cn/component/camera.html#camera

代码如下(示例):文章来源地址https://www.toymoban.com/news/detail-488066.html

<template>
	<view>
        <camera device-position="back" flash="off" @error="error" style="width: 100%; height: 300px;"></camera>
        <button type="primary" @click="takePhoto">拍照</button>
        <view>预览</view>
        <image mode="widthFix" :src="src"></image>
    </view>
</template>
export default {
    data() {
        return {
            src:""
        }
    },
    methods: {
         takePhoto() {
            const ctx = uni.createCameraContext();
            ctx.takePhoto({
                quality: 'high',
                success: (res) => {
                    this.src = res.tempImagePath
                }
            });
        },
        error(e) {
            console.log(e.detail);
        }
    }
}

属性说明:
uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题

二、使用cover-view,cover-image加辅助边框

代码如下(示例):

<camera mode="normal" :device-position="devicePosition" :flash="flashStyle"
			:style="{ height: cameraHeight + 'px' }" @error="errorCamera">
	<cover-view class="controls" style="width: 100%;height: 100%;">
		<cover-view class="controls1-bgcolor"></cover-view>
			<cover-view class="controls2-bgcolor">
				<!-- 人像照 -->
				<cover-image v-if="photoType=='idpositive'" class="w569-h828" :src="front" />
				<!-- 国徽照 -->
				<cover-image v-else class="w569-h828" :src="side" />
			</cover-view>
		<cover-view class="controls3-bgcolor"></cover-view>
	</cover-view>
</camera>

三、相机拒绝授权后,无法再次拉起授权问题

相机初次进入会拉起授权,授权拒绝后无法再次拉起,针对这个问题,可以先通过uni.getSetting获取用户的当前设置;

代码如下(示例):

uni.openSetting({
  success(res) {
    console.log(res.authSetting)
  }
});

然后通过uni.openSetting调起客户端小程序设置界面,进行设置,并返回用户设置的操作结果。

uni.openSetting({
  success(res) {
    console.log(res.authSetting)
  }
});

解决相机无法拉起授权问题重点:什么时候获取用户的当前设置?什么时候拉起相机小程序相机设置界面?
1、获取用户当前设置只能在camera组件使用页面使用该方法
2、如果小程序初始化就获取当前设置 并拉起相机设置界面,会存在相机初始化时同时加载默认授权弹框和自定义弹框
3、由于相机授权决绝后即不允许使用摄像头,@error事件刚好是 用户不允许使用摄像头时触发,正确的使用是在@error事件中使用

errorCamera(e){
	const that = this;
				uni.getSetting({
					success(res) {
						if (!res.authSetting["scope.camera"]) {
								uni.showModal({
									title: '提示',
									content: '请开启摄像头权限,否则无法拍照',
									confirmText: '去开启',
									success(res) {
										if (res.confirm) {
											uni.openSetting({
												success(res) {
													if (res.authSetting["scope.camera"]) {
														uni.navigateBack({
															delta: 1
														})
													} else {
														uni.navigateBack({
															delta: 1
														})
													}
												}
											})
										} else if (res.cancel) {
											uni.navigateBack({
												delta: 1
											})
										}
									}
								})
						}
					}
				})
			},			

uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题


完整的代码

提示:相机框引导框可以让ui设计

代码如下(示例):

<template>
	<view :style="{ height: windowHeight + 'px' }">
		<camera mode="normal" :device-position="devicePosition" :flash="flashStyle"
			:style="{ height: cameraHeight + 'px' }" @error="errorCamera">
			<cover-view class="controls" style="width: 100%;height: 100%;">
				<cover-view class="controls1-bgcolor"></cover-view>
				<cover-view class="controls2-bgcolor">
					<!-- 人像照 -->
					<cover-image v-if="photoType=='idpositive'" class="w569-h828" :src="front" />
					<!-- 国徽照 -->
					<cover-image v-else class="w569-h828" :src="side" />
				</cover-view>
				<cover-view class="controls3-bgcolor"></cover-view>
			</cover-view>
		</camera>
		<view class="bottom font-36-fff">
			<view class="wrap">
				<view class="back" @click="switchBtn">
					<image :src="flip" mode="" style="width: 60rpx; height: 60rpx;"></image>
				</view>
				<!-- <view class="back" @click="flashBtn">闪光灯</view> -->
				<view @click="takePhoto">
					<image class="w131-h131" :src="icon">
					</image>
				</view>
				<view @click="chooseImage">
					<image :src="picture" mode="" style="width: 60rpx; height: 60rpx;"></image>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				front: '../../static/idcard/front.png', // 人像照
				side: '../../static/idcard/side.png', // 国徽照
				flip: '../../static/idcard/flip.png', // 反转
				icon: '../../static/idcard/icon.png', // 相机
				picture: '../../static/idcard/picture.png', // 照片
				cameraContext: {},
				windowHeight: '',
				cameraHeight: '',
				idcardFrontSide: true,
				photoType: '',
				devicePosition: 'back', // 摄像头默认后置
				flashStyle: 'off',
			};
		},
		onLoad(options) {
			if (uni.createCameraContext) {
				this.cameraContext = uni.createCameraContext()
			} else {
				// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
				uni.showModal({
					title: '提示',
					content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
				})
			}
			this.photoType = options.photoType;
			this.devicePosition = 'back';
		},
		onShow() {
			const systemInfo = uni.getSystemInfoSync()
			this.windowHeight = systemInfo.windowHeight
			this.cameraHeight = systemInfo.windowHeight - 80
		},
		methods: {
			errorCamera(e){
				const that = this;
				uni.getSetting({
					success(res) {
						if (!res.authSetting["scope.camera"]) {
								uni.showModal({
									title: '提示',
									content: '请开启摄像头权限,否则无法拍照',
									confirmText: '去开启',
									success(res) {
										if (res.confirm) {
											uni.openSetting({
												success(res) {
													if (res.authSetting["scope.camera"]) {
														uni.navigateBack({
															delta: 1
														})
													} else {
														uni.navigateBack({
															delta: 1
														})
													}
												}
											})
										} else if (res.cancel) {
											uni.navigateBack({
												delta: 1
											})
										}
									}
								})
						}
					}
				})
			},
			// 拍照
			takePhoto() {
				uni.showLoading({
					title: '拍摄中'
				})
				this.cameraContext.takePhoto({
					quality: 'normal',
					success: (res) => {
						console.log('拍摄照片', res)
						let idPhoto = res.tempImagePath;
						this.chosePhoto(idPhoto);
						uni.showToast({
							title: '拍照成功',
							icon: 'none',
							duration: 1200
						})
					},
					fail: (err) => {
						uni.showToast({
							title: '拍照失败,请检查系统是否授权',
							icon: 'none',
							duration: 1200
						})
					}
				})
			},
			// 从相册选取
			chooseImage() {
				uni.chooseImage({
					count: 1,
					sizeType: ['original', 'compressed'],
					sourceType: ['album'],
					success: (res) => {
						let idPhoto = res.tempFilePaths[0];
						this.chosePhoto(idPhoto);
					},
					fail: (err) => {}
				});
			},
			//反转
			switchBtn() {
				if (this.devicePosition == 'front') {
					this.devicePosition = 'back'
				} else {
					this.devicePosition = 'front'
				}
			},
			// flashBtn(){
			// 	if(this.flashStyle == 'on'){
			// 		this.flashStyle = 'off'
			// 	}else{
			// 		this.flashStyle = 'on'
			// 	}
			// },
			// 选择图片跳转
			chosePhoto(item) {
				if (this.photoType == 'idpositive') {
					let pages = getCurrentPages(); //获取所有页面栈实例列表
					let nowPage = pages[pages.length - 1]; //当前页页面实例
					let prevPage = pages[pages.length - 2]; //上一页页面实例
					prevPage.$vm.idpositive = item; //修改上一页data里面的参数值
					prevPage.$vm.checkoutface = true; //修改上一页data里面的参数值
					uni.navigateBack({ //uni.navigateTo跳转的返回,默认1为返回上一级
						delta: 1
					});
				} else if (this.photoType == 'idback') {
					let pages = getCurrentPages(); //获取所有页面栈实例列表
					let nowPage = pages[pages.length - 1]; //当前页页面实例
					let prevPage = pages[pages.length - 2]; //上一页页面实例
					prevPage.$vm.idback = item; //修改上一页data里面的参数值
					prevPage.$vm.checkoutId = true; //修改上一页data里面的参数值
					uni.navigateBack({ //uni.navigateTo跳转的返回,默认1为返回上一级
						delta: 1
					});
				}

			}
		},
	}
</script>

<style lang="less" scoped>
	.icon-w569-h828 {
		width: 569rpx;
		height: 828rpx;
	}

	.controls {
		display: flex;
		align-items: center;
		justify-content: center;
		flex-direction: column;
	}

	.controls1-bgcolor {
		list-style: none;
		padding: 0;
		margin: 0;
		width: 100%;
		height: 60%;
		background-color: rgba(248, 248, 248, 0.6);
	}

	.controls2-bgcolor {
		list-style: none;
		padding: 0;
		margin: 0;
		width: 100%;
		height: 110%;
		display: flex;
		align-items: center;
		justify-content: center;
	}

	.controls2-bgcolor1 {
		width: 7%;
		height: 150%;
		background-color: rgba(248, 248, 248, 0.6);
	}

	.controls3-bgcolor {
		list-style: none;
		padding: 0;
		margin: 0;
		width: 100%;
		height: 60%;
		background-color: rgba(248, 248, 248, 0.6);
	}

	.bottom {
		width: 100%;
		background-color: #000;

		.wrap {
			display: flex;
			align-items: center;
			justify-content: space-between;
			height: 80px;
			padding: 0 73rpx;
		}
	}

	.w569-h828 {
		width: 650rpx;
		height: 460rpx;
		background-color: rgba(0, 0, 0, 0) !important;
	}

	.w131-h131 {
		width: 131rpx;
		height: 131rpx;
	}

	.font-36-fff {
		font-size: 36rpx;
		color: #fff;
	}
</style>

到了这里,关于uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp微信小程序自定义封装分段器。

    话不多说先上效果 这里我用的是cil框架 vue3 下面贴代码 组价代码: 父组件使用方法:

    2024年02月04日
    浏览(31)
  • 微信小程序使用uniapp自定义tabbar

    第一步:在pages.json里定义自己tabbar路径,定义的时候只需要写上页面路径即可  第二步:自定义tabbar页面,为了实现点击动作的动态效果,需要用到watch监听父组件传来的值的改变  自定义tabbar页面全部代码 注:该页面可以直接用组件的方式来放,因为uniapp支持easycom模式,

    2024年02月13日
    浏览(33)
  • uniapp微信小程序自定义表单校验失效

    用uniapp的uni-forms写微信小程序,发现自定义校验方法在小程序端失效,解决方法如下 html js rules的validateFunction使用异步校验 onLoad方法中手动设置rules

    2024年02月08日
    浏览(43)
  • uniapp微信小程序自定义弹窗组件

    写一个能够复用的弹窗组件,内容包括: \\\"标题\\\",\\\"图片\\\",\\\"描述内容\\\",\\\"按钮\\\". 且按钮可能会有多中功能(比如: 点击按钮可能只是关闭弹窗,或者关闭弹窗并跳转) 1.创建弹窗组件 popup-view 1.小编这里考虑组件全局都有可能会用到,就在主包的 components 文件夹下创建popup-view组件 2.组件内

    2024年02月04日
    浏览(30)
  • uniapp 微信小程序 placeholder字体、颜色自定义

    效果图: 1、template 2、style

    2024年02月16日
    浏览(38)
  • uniapp微信小程序使用canvas自定义分享名片

    template js 需要分享的页面加上onShareAppMessage,在methods中定义绘画方法createCanvasImage css这里是画布的内容设置

    2024年02月14日
    浏览(36)
  • uniapp&&微信小程序底部弹窗自定义组件

    个人项目地址: SubTopH前端开发个人站   (自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面) SubTopH前端开发个人站 https://subtop.gitee.io/subtoph.github.io/#/home  基础弹窗效果组件 在页面使用 父组件

    2024年02月14日
    浏览(39)
  • placeholder样式自定义(uniapp 微信小程序、h5)

    一、使用uniapp开发 ①第一种方式:(写在行内) ②第二种方式: (给input加上placeholder-class属性,然后给该属性 设置一个类名,在style中设置样式。) 二、使用H5开发

    2024年02月09日
    浏览(30)
  • 微信小程序、uniapp自定义底部导航栏(附源码)

    需求分析 目前开发一套“同城跑腿平台”小程序,面向用户和骑手,需要两个不同的底部导航,uniapp原生导航不满足要求。所以需要自定义导航栏。 随着自定义导航卡完成,切换选项卡页面总是闪烁,在网上也没有搜到完整的解决方法,总不能完美解决。现在我有一个方法

    2024年02月04日
    浏览(47)
  • 如何为微信小程序添加WXML模板和自定义组件

    微信小程序是一种基于微信平台的应用开发框架,开发者可以使用小程序框架提供的组件、API和开发工具,快速开发出符合微信用户体验的小程序。 在小程序中,WXML(WeiXin Markup Language)是一种类似HTML的标记语言,用于描述小程序的结构。WXML的语法和HTML非常相似,但是有一

    2024年03月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包