uniapp和vue实现打开手机前置摄像头和相机的方法

最近在项目遇到了一个问题,用uniapp的框架做一个功能,就是打开平板自带的前置摄像头拍照,uniapp上的功能只有打开默认相机的功能,但是前置摄像头需要你自己去手动转换一下,客户体验感很不好,产品经理要求必须要打开就是前置摄像头~~~~~~~~~~~~~

这可愁坏了我,于是各种百度,小伙伴球高人指点,uniapp的官方群也问了,都么有用,其中群里有个人给了一个方法,但是调用腾讯云的接口,但是小编开发的是本地开发~

网上有个input方法,但是要在https环境下才能用。小编没用过,不知道有么有用~

好了废话不多

直接上代码

html部分

<template>
	<view class="content">
		<!-- 顶部tab -->
		<uni-nav-bar class="nav-tab" left-icon="back" color="#FFFFFF" backgroundColor="#3f62f6" statusBar="true"
			@clickLeft="tapBackIdColle">
			<template v-slot:left>
				<view class=" uni-flex uni-row" style="text-align: center;padding-top: 3px;">
					<text class="px14">面部采集</text>
				</view>
			</template>
			<!-- 	<view class=" uni-flex uni-row" style="text-align: center;position: absolute;right: 40px;" @tap="submit">
				<text style="font-size: 16px;">提交</text>
			</view> -->
		</uni-nav-bar>
		<view class="up-img ">
			<span class="up-span">点击采集面部照片</span>
			<view class="img-picker">
				<!-- 第一次采集 -->
				<view class="first">
					<image :class="imgFlag==true?'up-img-after':'up-img-box'" @click="takePhoto" :src="up_img" mode="">
					</image>
					<view class="btns" v-if="imgFlag==true">
						<button class="btn1" type="default" @click="retakePhoto" size="mini">重新采集</button>
						<button class="btn2" type="default" @click="confirm" size="mini">确定</button>
					</view>
				</view>

			</view>
		</view>


	</view>
</template>

<script>
	import {
		pathToBase64,
		base64ToPath
	} from 'image-tools';
	export default {
		data() {
			return {
				up_img: '../../../static/img/tzcj/up_img.png',
				// up_img:'file:///storage/emulated/0/Android/data/io.dcloud.HBuilder/apps/HBuilder/doc/camera/1633765326477.jpg',
				imgBase64: '',
				src: '',
				imgFlag: false
			}
		},
		onLoad() {
			let Camera = plus.camera.getCamera();
			console.log(Camera);
		},
		methods: {
			confirm(){//确定事件
			uni.showModal({
			    title: '提示',
			    content: '是否确定使用当前的图片',
			    success: function (res) {
			        if (res.confirm) {
			            console.log('用户点击确定');
						uni.navigateTo({
							url:'./tzcj?imgBase64='+that.imgBase64
						})
						
			        } else if (res.cancel) {
			            console.log('用户点击取消');
			        }
			    }
			});
				
			},
			retakePhoto(){//重新采集
			this.takePhoto();
				
			},
			tapBackIdColle() {//返回上一页
				uni.navigateTo({
					url: './tzcj'
				})
			},
			takePhoto() {// 拍照   
								  
				var cmr = plus.camera.getCamera(1);
				let that = this;
				cmr.captureImage(function(p) {
					//alert(p);//_doc/camera/1467602809090.jpg 
					console.log(p);
					plus.io.resolveLocalFileSystemURL(p, function(entry) {
						//alert(entry.toLocalURL());//file:///storage/emulated/0/Android/data/io.dcloud...../doc/camera/1467602809090.jpg   
						that.$nextTick(function() {
							that.up_img = entry.toLocalURL();
						})
						that.imgFlag = true;
						that.compressImage(entry.toLocalURL(), entry.name);


					}, function(e) {
						plus.nativeUI.toast("读取拍照文件错误:" + e.message);
					});
				}, function(e) {}, {
					filename: "_doc/camera/",
					index: 1
				});

			},
			//压缩图片   
			compressImage(url, filename) {
				let name = "_doc/upload/-" + filename; //_doc/upload/F_ZDDZZ-1467602809090.jpg   
				plus.zip.compressImage({
						src: url, //src: (String 类型 )压缩转换原始图片的路径   
						dst: name, //压缩转换目标图片的路径   
						quality: 20, //quality: (Number 类型 )压缩图片的质量.取值范围为1-100   
						overwrite: true //overwrite: (Boolean 类型 )覆盖生成新文件   
					},
					function(event) {
						//uploadf(event.target,divid);   
						var path = name; //压缩转换目标图片的路径   
						//event.target获取压缩转换后的图片url路   
						//filename图片名称   

						pathToBase64(path).then(p => {

							that.imgBase64 = p;
						}).catch(error => {
							console.error(error)
						});
					},
					function(error) {
						plus.nativeUI.toast("压缩图片失败,请稍候再试");
					});
			},





		}
	}
</script>

<style>
	.content {
		width: 100%;
		height: 100%;
		position: relative;
	}

	.up-img {
		display: flex;
		flex-direction: column;
		justify-content: center;
	}

	.up-span {
		/* position: absolute;
		top: 80px;		
		left: 40%;
		right: 30%; */

		color: #B23C3C;
		margin: 0 auto;
		margin-top: 15px;
		font-size: 20px;

	}

	.btns {
		transform: translateX(36%);
		margin-top: 20px;
	}

	.btn1 {
		background-color: #B13C3C !important;
		color: #FFFFFF !important;

	}

	.btn2 {
		background-color: #B13C3C !important;
		margin-left: 25px;
		color: #FFFFFF !important;
	}

	.up-img-box {
		width: 160px;
		height: 160px;
		border-radius: 25px;
		margin-left: 50%;
		margin-top: 15px;
		transform: translateX(-80px);
	}

	.up-img-after {
		width: 300px;
		height: 180px;
		border-radius: 25px;
		margin-left: 50%;
		margin-top: 15px;
		transform: translateX(-150px);
	}
</style>

### 回答1: 在Uniapp中,实现前置摄像头扫码可以通过使用uni-app官方提供的插件或者第三方插件来完成。 一种常见的实现方式是使用uni-app官方提供的`uni.scanCode`接口配合前置摄像头扫码功能。该接口可以打开设备摄像头并扫描二维码,返回扫描结果。 首先,在uni-app的页面中引入该接口,并在需要使用扫码功能的地方调用该接口。接口的调用方法如下: ``` uni.scanCode({ scanType: 'QR_CODE', success(res) { console.log(res.result) } }) ``` 在调用接口时,通过`scanType`参数指定扫描的码的类型,比如二维码`QR_CODE`。然后在`success`回调函数中,可以通过`res.result`获取到扫描结果。 要实现前置摄像头扫码,可以通过uni-app官方提供的`<camera>`组件来设置前置摄像头。将该组件放置在需要展示摄像头预览的位置。在`<camera>`组件中,设置`position`属性为"front"即可使用前置摄像头。 ``` <camera position="front" style="width:100%; height:100%;"></camera> ``` 这样,通过调用`uni.scanCode`接口,并使用`<camera>`组件设置前置摄像头,就可以实现前置摄像头扫码功能了。 ### 回答2: uniapp是一款跨平台的应用开发框架,可以实现在多个移动平台上开发应用。要在uniapp实现前置摄像头扫码的功能,可以遵循以下步骤: 1. 首先,在uniapp项目中引入扫码相关的插件或库。可以使用uniapp官方提供的插件,如H5扫码插件或微信小程序扫码插件;或者使用第三方扫码库,如zxing.js或Quagga.js。 2.uniapp的页面中创建一个包含摄像头视图扫码结果的布局。可以使用<view>标签创建一个视图容器,然后在其中添加<camera>标签作为摄像头的预览区域,同时在页面中显示扫码结果的文字或图片。 3.uniapp的页面中编写相关的逻辑代码,实现调用前置摄像头进行扫码的功能。根据扫码插件或库的接口文档,编写代码来实现打开前置摄像头、开始扫码、获取扫码结果等操作。 4.uniapp的页面中添加按钮或其他触发事件的元素,用于启动扫码功能。可以在按钮的点击事件中调用扫码相关的代码,通过触发事件来打开前置摄像头进行扫码操作。 5. 最后,进行测试。在支持前置摄像头的设备上运行uniapp应用,并测试扫码功能是否正常。可以尝试用其他设备上的二维码来进行扫码测试,验证扫描结果是否正确。 总结:通过在uniapp项目中引入扫码插件或库,并在页面中添加摄像头视图扫码结果的布局,编写相关的逻辑代码,实现调用前置摄像头进行扫码,最后进行测试,可以在uniapp实现前置摄像头扫码的功能。 ### 回答3: 在uniapp中,如果想要使用前置摄像头来扫描二维码,可以通过调用uni.scanCode()方法实现。该方法可以在uni-app支持的平台上调用设备的摄像头来扫描二维码。 首先,我们需要在uniapp的pages.json文件中声明需要使用相机权限,确保应用程序有权限访问设备的摄像头。在pages.json的"permission"字段中添加"camera"权限。 接下来,在需要进行扫码的页面中,使用uni.scanCode()方法来调用摄像头进行扫描。可以在页面的methods中定义一个scanCode方法,在该方法中使用uni.scanCode()来调用前置摄像头。 以下是一个示例代码: // index.vue <template> <view> <button @click="scanCode">扫描二维码</button> </view> </template> <script> export default { methods: { scanCode() { uni.scanCode({ success: (res) => { console.log(res.result); // 在这里可以处理扫描成功后的操作 }, fail: (err) => { console.log(err); // 如果扫描失败,可以在这里进行处理 } }); } } } </script> 通过以上的代码示例,当用户点击按钮时,uni.scanCode()方法会调用前置摄像头进行二维码扫描。扫描成功后,可以通过success回调函数来获取扫描结果,进行后续的操作。如果扫描失败,可以通过fail回调函数来处理错误。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镜中的女孩-potato

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值