我们正在为手机创建一个 HTML5网站,需要通过网络浏览器获得相机访问,而不是一个本地应用程序。我们在 iOS 系统中很难做到这一点。有人知道怎么解决这个问题吗?
皮卡应用程序是一种从 HTML5页面获取图片并上传到服务器的方法。它需要在服务器上进行一些额外的编程,但是除了 PhoneGap,我没有找到其他的方法。
我觉得这个起作用了。 录制视频或音频;
<input type="file" accept="video/*;capture=camcorder"> <input type="file" accept="audio/*;capture=microphone">
或(新方法)
<device type="media" onchange="update(this.data)"></device> <video autoplay></video> <script> function update(stream) { document.querySelector('video').src = stream.url; } </script>
如果不是,可能会在 ios6上工作,更多的细节可以在 获取用户媒体上找到
在 iOS6中,苹果通过 <input type="file">标签支持这一点。我在苹果的开发者文档中找不到有用的链接,但是有一个例子 给你。
<input type="file">
它看起来像覆盖和更高级的功能尚未可用,但这应该工作的很多用例。
编辑: W3c 有一个规范,iOS6 Safari 似乎实现了。 capture属性明显缺失。
capture
你可以试试这个:
<input type="file" capture="camera" accept="image/*" id="cameraInput" name="cameraInput">
但它 必须是 iOS6 + 工作。这将给你一个很好的对话,你可以选择要么采取一张照片或上传一个从您的专辑,即。
这里有一个例子: 在不使用 PhoneGap 的情况下捕获相机/图片数据
截至2015年,现在是 只是工作。
这将要求用户上传任何文件。在 iOS 8.x 上,这可以是一个相机视频,相机照片,或照片库中的照片/视频。
<input type="file" accept="image/*">
这是如上所述,但限制上传到 照片只从相机或图书馆,没有视频。
更新11/2020 : Google 开发者链接(目前)已经死亡。原来的文章与许多更多的解释仍然可以在 Web.archive. org找到。
这个问题已经存在了几年,但是在这段时间里,一些额外的可能性已经发生了变化,比如直接访问相机,显示预览和捕捉快照(例如二维码扫描)。
这篇 Google 开发者文章提供了对所有(?)的深入解释如何将图像/照相机数据导入 web 应用程序,从“到处工作”(甚至在桌面浏览器中)到“只能在带有照相机的现代最新移动设备上工作”。还有很多有用的提示。
解释方法:
要求一个 URL: 最简单但最不令人满意。
文件输入(这里大多数其他帖子都有提到) : 通过侦听 input 元素上的 onchange 事件,然后读取事件目标的 files 属性,可以将数据附加到 a 或用 JavaScript 进行操作。
<input type="file" accept="image/*" id="file-input"> <script> const fileInput = document.getElementById('file-input'); fileInput.addEventListener('change', (e) => doSomethingWithFiles(e.target.files)); </script>
files属性是 FileList 对象。
files
<div id="target">You can drag an image file here</div> <script> const target = document.getElementById('target'); target.addEventListener('drop', (e) => { e.stopPropagation(); e.preventDefault(); doSomethingWithFiles(e.dataTransfer.files); }); target.addEventListener('dragover', (e) => { e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = 'copy'; }); </script>
可以从 drop事件的 dataTransfer.files属性获取 FileList对象。
drop
dataTransfer.files
FileList
<textarea id="target">Paste an image here</textarea> <script> const target = document.getElementById('target'); target.addEventListener('paste', (e) => { e.preventDefault(); doSomethingWithFiles(e.clipboardData.files); }); </script>
e.clipboardData.files又是一个 FileList对象。
e.clipboardData.files
const supported = 'mediaDevices' in navigator;
<video id="player" controls autoplay></video> <button id="capture">Capture</button> <canvas id="canvas" width=320 height=240></canvas> <script> const player = document.getElementById('player'); const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); const captureButton = document.getElementById('capture'); const constraints = { video: true, }; captureButton.addEventListener('click', () => { // Draw the video frame to the canvas. context.drawImage(player, 0, 0, canvas.width, canvas.height); }); // Attach the video stream to the video element and autoplay. navigator.mediaDevices.getUserMedia(constraints) .then((stream) => { player.srcObject = stream; }); </script>
别忘了停止视频流
player.srcObject.getVideoTracks().forEach(track => track.stop());