In the early days of mobile web, it was not possible to access the camera from a web page. While Android added the functionality a while ago in Honeycomb, it seems to have quietly slipped in to iOS in 6.0. So now, the majority of smartphone users can use the camera from a web site.
The HTML code is to access the camera is surprisingly simple:
<input type='file' accept="image/*" capture="camera" onchange="previewImage(this);" />
The accept and capture attributes do all the work. In my example I’ve also added an onchange handler to add a preview of the image to the HTML page:
<div style="height: 400px; width:200px"><img id="preview" src="" alt="your image here" /></div> <script type="text/javascript"> $('#preview').on('load',function() { var css; var ratio=$(this).width() / $(this).height(); var pratio=$(this).parent().width() / $(this).parent().height(); if (ratio<pratio) { css={width:'auto', height:'100%'}; } else { css={width:'100%', height:'auto'}; } $(this).css(css); });
function previewImage(input) { if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { $('#preview').attr('src',e.target.result) }; reader.readAsDataURL(input.files[0]); } } </script>
Interestingly, on iOS the photo stays in memory and is not persisted to the device. On Android, the photo is automatically persisted to the gallery. I suspect this is for memory management.
I have tested this code successfully on the following platforms:
- Android 3.0+ browser
- Chrome on Android
- Mobile Safari on iOS6+
- BlackBerry 10
The only large group of smartphone users left out in the cold are Android users still on Gingerbread.
I tested this code on WP8, and it didn’t work. There may be a work around, but I haven’t had a chance to work that out yet.