You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ti...@apache.org on 2013/09/11 23:21:07 UTC
[1/2] spec commit: [CB-4488] - added some manual capture tests
Updated Branches:
refs/heads/master 06f014246 -> 9f8ca3e9e
[CB-4488] - added some manual capture tests
Project: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/commit/bf272273
Tree: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/tree/bf272273
Diff: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/diff/bf272273
Branch: refs/heads/master
Commit: bf2722737eca75fd757d831e8b3e3479eed0353a
Parents: 06f0142
Author: timkim <ti...@apche.org>
Authored: Tue Sep 10 14:45:27 2013 -0700
Committer: timkim <ti...@apche.org>
Committed: Tue Sep 10 14:45:27 2013 -0700
----------------------------------------------------------------------
capture/index.html | 407 ++++++++++++++++++++++++++++++++++++++++++++++++
index.html | 1 +
2 files changed, 408 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/blob/bf272273/capture/index.html
----------------------------------------------------------------------
diff --git a/capture/index.html b/capture/index.html
new file mode 100644
index 0000000..309de1a
--- /dev/null
+++ b/capture/index.html
@@ -0,0 +1,407 @@
+<!DOCTYPE html>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+
+<html>
+ <head>
+ <meta name="viewport" content="width=device-width,height=device-height,user-scalable=no,maximum-scale=1.0,initial-scale=1.0" />
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <!-- ISO-8859-1 -->
+ <title>Cordova Mobile Spec</title>
+ <link rel="stylesheet" href="../master.css" type="text/css" media="screen" title="no title" charset="utf-8">
+ <script type="text/javascript" charset="utf-8" src="../cordova-incl.js"></script>
+
+
+<script type="text/javascript" charset="utf-8">
+
+ var deviceReady = false;
+ var platformId = cordova.require('cordova/platform').id;
+ var pictureUrl = null;
+ var fileObj = null;
+ var fileEntry = null;
+ var pageStartTime = +new Date();
+ var capture = navigator.device.capture;
+
+
+ //-------------------------------------------------------------------------
+ // Camera
+ //-------------------------------------------------------------------------
+
+ function log(value) {
+ console.log(value);
+ document.getElementById('camera_status').textContent += (new Date() - pageStartTime) / 1000 + ': ' + value + '\n';
+ }
+
+ function captureAudioWin(mediaFiles){
+ /*
+ var i, path, len;
+ for (i = 0, len = mediaFiles.length; i < len; i += 1) {
+ path = mediaFiles[i].fullPath;
+ // do something interesting with the file
+ }
+ */
+ var m = new Media(mediaFiles[i].fullPath);
+ m.play();
+ }
+
+ function captureAudioFail(e){
+ log('Error getting audio: ' + e.code);
+ }
+
+ function getAudio(){
+ clearStatus();
+ var options = { limit: 1, duration: 10};
+ capture.captureAudio(captureAudioWin, captureAudioFail, options);
+
+ }
+
+ function clearStatus() {
+ document.getElementById('camera_status').innerHTML = '';
+ document.getElementById('camera_image').src = 'about:blank';
+ var canvas = document.getElementById('canvas');
+ canvas.width = canvas.height = 1;
+ pictureUrl = null;
+ fileObj = null;
+ fileEntry = null;
+ }
+
+ function setPicture(url, callback) {
+ try {
+ window.atob(url);
+ // if we got here it is a base64 string (DATA_URL)
+ url = "data:image/jpeg;base64," + url;
+ } catch (e) {
+ // not DATA_URL
+ log('URL: ' + url.slice(0, 100));
+ }
+
+ pictureUrl = url;
+ var img = document.getElementById('camera_image');
+ var startTime = new Date();
+ img.src = url;
+ img.onloadend = function() {
+ log('Image tag load time: ' + (new Date() - startTime));
+ callback && callback();
+ };
+ }
+
+ function onGetPictureError(e) {
+ log('Error getting picture: ' + e.code);
+ }
+
+ function getPictureWin(data) {
+ setPicture(data);
+ // TODO: Fix resolveLocalFileSystemURI to work with native-uri.
+ if (pictureUrl.indexOf('file:') == 0) {
+ resolveLocalFileSystemURI(data, function(e) {
+ fileEntry = e;
+ logCallback('resolveLocalFileSystemURI()', true)(e);
+ }, logCallback('resolveLocalFileSystemURI()', false));
+ } else if (pictureUrl.indexOf('data:image/jpeg;base64' == 0)) {
+ // do nothing
+ } else {
+ var path = pictureUrl.replace(/^file:\/\/(localhost)?/, '').replace(/%20/g, ' ');
+ fileEntry = new FileEntry('image_name.png', path);
+ }
+ }
+
+ function getPicture() {
+ clearStatus();
+ var options = extractOptions();
+ log('Getting picture with options: ' + JSON.stringify(options));
+ var popoverHandle = navigator.camera.getPicture(getPictureWin, onGetPictureError, options);
+
+ // Reposition the popover if the orientation changes.
+ window.onorientationchange = function() {
+ var newPopoverOptions = new CameraPopoverOptions(0, 0, 100, 100, 0);
+ popoverHandle.setPosition(newPopoverOptions);
+ }
+ }
+
+ function uploadImage() {
+ var ft = new FileTransfer(),
+ uploadcomplete=0,
+ progress = 0,
+ options = new FileUploadOptions();
+ options.fileKey="photo";
+ options.fileName='test.jpg';
+ options.mimeType="image/jpeg";
+ ft.onprogress = function(progressEvent) {
+ log('progress: ' + progressEvent.loaded + ' of ' + progressEvent.total);
+ };
+ var server = "http://cordova-filetransfer.jitsu.com";
+
+ ft.upload(pictureUrl, server + '/upload', win, fail, options);
+ function win(information_back){
+ log('upload complete');
+ }
+ function fail(message) {
+ log('upload failed: ' + JSON.stringify(message));
+ }
+ }
+
+ function logCallback(apiName, success) {
+ return function() {
+ log('Call to ' + apiName + (success ? ' success: ' : ' failed: ') + JSON.stringify([].slice.call(arguments)));
+ };
+ }
+
+ /**
+ * Select image from library using a NATIVE_URI destination type
+ * This calls FileEntry.getMetadata, FileEntry.setMetadata, FileEntry.getParent, FileEntry.file, and FileReader.readAsDataURL.
+ */
+ function readFile() {
+ function onFileReadAsDataURL(evt) {
+ var img = document.getElementById('camera_image');
+ img.style.visibility = "visible";
+ img.style.display = "block";
+ img.src = evt.target.result;
+ log("FileReader.readAsDataURL success");
+ };
+
+ function onFileReceived(file) {
+ log('Got file: ' + JSON.stringify(file));
+ fileObj = file;
+
+ var reader = new FileReader();
+ reader.onload = function() {
+ log('FileReader.readAsDataURL() - length = ' + reader.result.length);
+ };
+ reader.onerror = logCallback('FileReader.readAsDataURL', false);
+ reader.readAsDataURL(file);
+ };
+ // Test out onFileReceived when the file object was set via a native <input> elements.
+ if (fileObj) {
+ onFileReceived(fileObj);
+ } else {
+ fileEntry.file(onFileReceived, logCallback('FileEntry.file', false));
+ }
+ }
+ function getFileInfo() {
+ // Test FileEntry API here.
+ fileEntry.getMetadata(logCallback('FileEntry.getMetadata', true), logCallback('FileEntry.getMetadata', false));
+ fileEntry.setMetadata(logCallback('FileEntry.setMetadata', true), logCallback('FileEntry.setMetadata', false), { "com.apple.MobileBackup": 1 });
+ fileEntry.getParent(logCallback('FileEntry.getParent', true), logCallback('FileEntry.getParent', false));
+ fileEntry.getParent(logCallback('FileEntry.getParent', true), logCallback('FileEntry.getParent', false));
+ };
+
+ /**
+ * Copy image from library using a NATIVE_URI destination type
+ * This calls FileEntry.copyTo and FileEntry.moveTo.
+ */
+ function copyImage() {
+ var onFileSystemReceived = function(fileSystem) {
+ var destDirEntry = fileSystem.root;
+
+ // Test FileEntry API here.
+ fileEntry.copyTo(destDirEntry, 'copied_file.png', logCallback('FileEntry.copyTo', true), logCallback('FileEntry.copyTo', false));
+ fileEntry.moveTo(destDirEntry, 'moved_file.png', logCallback('FileEntry.moveTo', true), logCallback('FileEntry.moveTo', false));
+ };
+
+ window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, onFileSystemReceived, null);
+ };
+
+ /**
+ * Write image to library using a NATIVE_URI destination type
+ * This calls FileEntry.createWriter, FileWriter.write, and FileWriter.truncate.
+ */
+ function writeImage() {
+ var onFileWriterReceived = function(fileWriter) {
+ fileWriter.onwrite = logCallback('FileWriter.write', true);
+ fileWriter.onerror = logCallback('FileWriter.write', false);
+ fileWriter.write("some text!");
+ };
+
+ var onFileTruncateWriterReceived = function(fileWriter) {
+ fileWriter.onwrite = logCallback('FileWriter.truncate', true);
+ fileWriter.onerror = logCallback('FileWriter.truncate', false);
+ fileWriter.truncate(10);
+ };
+
+ fileEntry.createWriter(onFileWriterReceived, logCallback('FileEntry.createWriter', false));
+ fileEntry.createWriter(onFileTruncateWriterReceived, null);
+ };
+
+ function displayImageUsingCanvas() {
+ var canvas = document.getElementById('canvas');
+ var img = document.getElementById('camera_image');
+ var w = img.width;
+ var h = img.height;
+ h = 100 / w * h;
+ w = 100;
+ canvas.width = w;
+ canvas.height= h;
+ var context = canvas.getContext('2d');
+ context.drawImage(img, 0, 0, w, h);
+ };
+
+ /**
+ * Remove image from library using a NATIVE_URI destination type
+ * This calls FileEntry.remove.
+ */
+ function removeImage() {
+ fileEntry.remove(logCallback('FileEntry.remove', true), logCallback('FileEntry.remove', false));
+ };
+
+ function testInputTag(inputEl) {
+ clearStatus();
+ // iOS 6 likes to dead-lock in the onchange context if you
+ // do any alerts or try to remote-debug.
+ window.setTimeout(function() {
+ testNativeFile2(inputEl);
+ }, 0);
+ };
+
+ function testNativeFile2(inputEl) {
+ if (!inputEl.value) {
+ alert('No file selected.');
+ return;
+ }
+ fileObj = inputEl.files[0];
+ if (!fileObj) {
+ alert('Got value but no file.');
+ return;
+ }
+ var URLApi = window.URL || window.webkitURL;
+ if (URLApi) {
+ var blobURL = URLApi.createObjectURL(fileObj);
+ if (blobURL) {
+ setPicture(blobURL, function() {
+ URLApi.revokeObjectURL(blobURL);
+ });
+ } else {
+ log('URL.createObjectURL returned null');
+ }
+ } else {
+ log('URL.createObjectURL() not supported.');
+ }
+ }
+
+ function extractOptions() {
+ var els = document.querySelectorAll('#image-options select');
+ var ret = {};
+ for (var i = 0, el; el = els[i]; ++i) {
+ var value = el.value;
+ if (value === '') continue;
+ if (el.isBool) {
+ ret[el.keyName] = !!+value;
+ } else {
+ ret[el.keyName] = +value;
+ }
+ }
+ return ret;
+ }
+
+ function createOptionsEl(name, values, selectionDefault) {
+ var container = document.createElement('div');
+ container.style.display = 'inline-block';
+ container.appendChild(document.createTextNode(name + ': '));
+ var select = document.createElement('select');
+ select.keyName = name;
+ container.appendChild(select);
+
+ // if we didn't get a default value, insert the blank <default> entry
+ if (selectionDefault == undefined) {
+ var opt = document.createElement('option');
+ opt.value = '';
+ opt.text = '<default>';
+ select.appendChild(opt);
+ }
+
+ select.isBool = typeof values == 'boolean';
+ if (select.isBool) {
+ values = {'true': 1, 'false': 0};
+ }
+
+ for (var k in values) {
+ var opt = document.createElement('option');
+ opt.value = values[k];
+ opt.textContent = k;
+ if (selectionDefault) {
+ if (selectionDefault[0] == k) {
+ opt.selected = true;
+ }
+ }
+ select.appendChild(opt);
+ }
+ var optionsDiv = document.getElementById('image-options');
+ optionsDiv.appendChild(container);
+ }
+
+ /**
+ * Function called when page has finished loading.
+ */
+ function init() {
+ document.addEventListener("deviceready", function() {
+ deviceReady = true;
+ console.log("Device="+device.platform+" "+device.version);
+ createOptionsEl('sourceType', Camera.PictureSourceType, camPictureSourceTypeDefault);
+ createOptionsEl('destinationType', Camera.DestinationType, camDestinationTypeDefault);
+ createOptionsEl('encodingType', Camera.EncodingType, camEncodingTypeDefault);
+ createOptionsEl('mediaType', Camera.MediaType, camMediaTypeDefault);
+ createOptionsEl('quality', {'0': 0, '50': 50, '80': 80, '100': 100}, camQualityDefault);
+ createOptionsEl('targetWidth', {'50': 50, '200': 200, '800': 800, '2048': 2048});
+ createOptionsEl('targetHeight', {'50': 50, '200': 200, '800': 800, '2048': 2048});
+ createOptionsEl('allowEdit', true, camAllowEditDefault);
+ createOptionsEl('correctOrientation', true, camCorrectOrientationDefault);
+ createOptionsEl('saveToPhotoAlbum', true, camSaveToPhotoAlbumDefault);
+ createOptionsEl('cameraDirection', Camera.Direction);
+
+ }, false);
+ window.setTimeout(function() {
+ if (!deviceReady) {
+ alert("Error: Apache Cordova did not initialize. Demo will not run correctly.");
+ }
+ },1000);
+ };
+
+</script>
+
+ </head>
+ <body onload="init();" id="stage" class="theme">
+
+ <h1>Camera</h1>
+ <div id="info" style="white-space: pre-wrap">
+ <b>Status:</b> <div id="camera_status"></div>
+ img: <img width="100" id="camera_image">
+ canvas: <canvas id="canvas" width="1" height="1"></canvas>
+ </div>
+ <h2>Cordova Capture API</h2>
+ <div id="image-options"></div>
+ <div class="btn large" onclick="getPicture();">camera.getPicture()</div>
+ <h2>Native File Inputs</h2>
+ <div>input type=file <input type="file" onchange="testInputTag(this)"></div>
+ <div>capture=camera <input type="file" accept="image/*;capture=camera" onchange="testInputTag(this)"></div>
+ <div>capture=camcorder <input type="file" accept="video/*;capture=camcorder" onchange="testInputTag(this)"></div>
+ <div>capture=microphone <input type="file" accept="audio/*;capture=microphone" onchange="testInputTag(this)"></div>
+ <h2>Actions</h2>
+ <div class="btn large" onclick="getFileInfo();">Get File Metadata</div>
+ <div class="btn large" onclick="readFile();">Read with FileReader</div>
+ <div class="btn large" onclick="copyImage();">Copy Image</div>
+ <div class="btn large" onclick="writeImage();">Write Image</div>
+ <div class="btn large" onclick="uploadImage();">Upload Image</div>
+ <div class="btn large" onclick="displayImageUsingCanvas();">Draw Using Canvas</div>
+ <div class="btn large" onclick="removeImage();">Remove Image</div>
+
+ <div class="btn large" onclick="getAudio();">Capture and play audio</div>
+ <h2> </h2><div class="backBtn" onclick="backHome();">Back</div>
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/blob/bf272273/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 727c504..568d94f 100644
--- a/index.html
+++ b/index.html
@@ -47,6 +47,7 @@
<a href="audio/index.html" class="btn large">Audio Play/Record</a>
<a href="battery/index.html" class="btn large">Battery</a>
<a href="camera/index.html" class="btn large">Camera</a>
+ <a href="capture/index.html" class="btn large">Capture</a>
<a href="compass/index.html" class="btn large">Compass</a>
<a href="contacts/index.html" class="btn large">Contacts</a>
<a href="events/index.html" class="btn large">Events</a>
[2/2] spec commit: [CB-4488] - refactored manual capture test
Posted by ti...@apache.org.
[CB-4488] - refactored manual capture test
Project: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/commit/9f8ca3e9
Tree: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/tree/9f8ca3e9
Diff: http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/diff/9f8ca3e9
Branch: refs/heads/master
Commit: 9f8ca3e9e6ba8afb2f59fcb09055b49a999f54ca
Parents: bf27227
Author: timkim <ti...@apche.org>
Authored: Wed Sep 11 14:19:31 2013 -0700
Committer: timkim <ti...@apche.org>
Committed: Wed Sep 11 14:19:31 2013 -0700
----------------------------------------------------------------------
capture/index.html | 361 +++++++-----------------------------------------
1 file changed, 52 insertions(+), 309 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-mobile-spec/blob/9f8ca3e9/capture/index.html
----------------------------------------------------------------------
diff --git a/capture/index.html b/capture/index.html
index 309de1a..ef4b0e2 100644
--- a/capture/index.html
+++ b/capture/index.html
@@ -34,12 +34,7 @@
var deviceReady = false;
var platformId = cordova.require('cordova/platform').id;
- var pictureUrl = null;
- var fileObj = null;
- var fileEntry = null;
var pageStartTime = +new Date();
- var capture = navigator.device.capture;
-
//-------------------------------------------------------------------------
// Camera
@@ -51,15 +46,10 @@
}
function captureAudioWin(mediaFiles){
- /*
- var i, path, len;
- for (i = 0, len = mediaFiles.length; i < len; i += 1) {
- path = mediaFiles[i].fullPath;
- // do something interesting with the file
- }
- */
- var m = new Media(mediaFiles[i].fullPath);
- m.play();
+ var path = mediaFiles[0].fullPath;
+ log('Audio captured: ' + path);
+ var m = new Media(path);
+ m.play();
}
function captureAudioFail(e){
@@ -69,281 +59,56 @@
function getAudio(){
clearStatus();
var options = { limit: 1, duration: 10};
- capture.captureAudio(captureAudioWin, captureAudioFail, options);
-
+ navigator.device.capture.captureAudio(captureAudioWin, captureAudioFail, options);
}
- function clearStatus() {
- document.getElementById('camera_status').innerHTML = '';
- document.getElementById('camera_image').src = 'about:blank';
- var canvas = document.getElementById('canvas');
- canvas.width = canvas.height = 1;
- pictureUrl = null;
- fileObj = null;
- fileEntry = null;
+ function captureImageWin(mediaFiles){
+ var path = mediaFiles[0].fullPath;
+ log('Image captured: ' + path);
+ document.getElementById('camera_image').src = path;
}
-
- function setPicture(url, callback) {
- try {
- window.atob(url);
- // if we got here it is a base64 string (DATA_URL)
- url = "data:image/jpeg;base64," + url;
- } catch (e) {
- // not DATA_URL
- log('URL: ' + url.slice(0, 100));
- }
- pictureUrl = url;
- var img = document.getElementById('camera_image');
- var startTime = new Date();
- img.src = url;
- img.onloadend = function() {
- log('Image tag load time: ' + (new Date() - startTime));
- callback && callback();
- };
- }
-
- function onGetPictureError(e) {
- log('Error getting picture: ' + e.code);
+ function captureImageFail(e){
+ log('Error getting image: ' + e.code);
}
-
- function getPictureWin(data) {
- setPicture(data);
- // TODO: Fix resolveLocalFileSystemURI to work with native-uri.
- if (pictureUrl.indexOf('file:') == 0) {
- resolveLocalFileSystemURI(data, function(e) {
- fileEntry = e;
- logCallback('resolveLocalFileSystemURI()', true)(e);
- }, logCallback('resolveLocalFileSystemURI()', false));
- } else if (pictureUrl.indexOf('data:image/jpeg;base64' == 0)) {
- // do nothing
- } else {
- var path = pictureUrl.replace(/^file:\/\/(localhost)?/, '').replace(/%20/g, ' ');
- fileEntry = new FileEntry('image_name.png', path);
- }
- }
-
- function getPicture() {
+
+ function getImage(){
clearStatus();
- var options = extractOptions();
- log('Getting picture with options: ' + JSON.stringify(options));
- var popoverHandle = navigator.camera.getPicture(getPictureWin, onGetPictureError, options);
-
- // Reposition the popover if the orientation changes.
- window.onorientationchange = function() {
- var newPopoverOptions = new CameraPopoverOptions(0, 0, 100, 100, 0);
- popoverHandle.setPosition(newPopoverOptions);
- }
- }
-
- function uploadImage() {
- var ft = new FileTransfer(),
- uploadcomplete=0,
- progress = 0,
- options = new FileUploadOptions();
- options.fileKey="photo";
- options.fileName='test.jpg';
- options.mimeType="image/jpeg";
- ft.onprogress = function(progressEvent) {
- log('progress: ' + progressEvent.loaded + ' of ' + progressEvent.total);
- };
- var server = "http://cordova-filetransfer.jitsu.com";
-
- ft.upload(pictureUrl, server + '/upload', win, fail, options);
- function win(information_back){
- log('upload complete');
- }
- function fail(message) {
- log('upload failed: ' + JSON.stringify(message));
- }
- }
-
- function logCallback(apiName, success) {
- return function() {
- log('Call to ' + apiName + (success ? ' success: ' : ' failed: ') + JSON.stringify([].slice.call(arguments)));
- };
+ var options = { limit: 1 };
+ navigator.device.capture.captureImage(captureImageWin, captureImageFail, options);
+ }
+
+ function captureVideoWin(mediaFiles){
+ var path = mediaFiles[0].fullPath;
+ log('Video captured: ' + path);
+
+ // need to inject the video element into the html
+ // doesn't seem to work if you have a pre-existing video element and
+ // add in a source tag
+ var vid = document.createElement('video');
+ vid.id="theVideo";
+ vid.width = "320";
+ vid.height= "240";
+ var source_vid = document.createElement('source');
+ source_vid.id = "theSource";
+ source_vid.src = path;
+ vid.appendChild(source_vid);
+ document.getElementById('video_container').appendChild(vid);
}
-
- /**
- * Select image from library using a NATIVE_URI destination type
- * This calls FileEntry.getMetadata, FileEntry.setMetadata, FileEntry.getParent, FileEntry.file, and FileReader.readAsDataURL.
- */
- function readFile() {
- function onFileReadAsDataURL(evt) {
- var img = document.getElementById('camera_image');
- img.style.visibility = "visible";
- img.style.display = "block";
- img.src = evt.target.result;
- log("FileReader.readAsDataURL success");
- };
-
- function onFileReceived(file) {
- log('Got file: ' + JSON.stringify(file));
- fileObj = file;
-
- var reader = new FileReader();
- reader.onload = function() {
- log('FileReader.readAsDataURL() - length = ' + reader.result.length);
- };
- reader.onerror = logCallback('FileReader.readAsDataURL', false);
- reader.readAsDataURL(file);
- };
- // Test out onFileReceived when the file object was set via a native <input> elements.
- if (fileObj) {
- onFileReceived(fileObj);
- } else {
- fileEntry.file(onFileReceived, logCallback('FileEntry.file', false));
- }
+
+ function captureVideoFail(e){
+ log('Error getting video: ' + e.code);
}
- function getFileInfo() {
- // Test FileEntry API here.
- fileEntry.getMetadata(logCallback('FileEntry.getMetadata', true), logCallback('FileEntry.getMetadata', false));
- fileEntry.setMetadata(logCallback('FileEntry.setMetadata', true), logCallback('FileEntry.setMetadata', false), { "com.apple.MobileBackup": 1 });
- fileEntry.getParent(logCallback('FileEntry.getParent', true), logCallback('FileEntry.getParent', false));
- fileEntry.getParent(logCallback('FileEntry.getParent', true), logCallback('FileEntry.getParent', false));
- };
-
- /**
- * Copy image from library using a NATIVE_URI destination type
- * This calls FileEntry.copyTo and FileEntry.moveTo.
- */
- function copyImage() {
- var onFileSystemReceived = function(fileSystem) {
- var destDirEntry = fileSystem.root;
-
- // Test FileEntry API here.
- fileEntry.copyTo(destDirEntry, 'copied_file.png', logCallback('FileEntry.copyTo', true), logCallback('FileEntry.copyTo', false));
- fileEntry.moveTo(destDirEntry, 'moved_file.png', logCallback('FileEntry.moveTo', true), logCallback('FileEntry.moveTo', false));
- };
-
- window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, onFileSystemReceived, null);
- };
-
- /**
- * Write image to library using a NATIVE_URI destination type
- * This calls FileEntry.createWriter, FileWriter.write, and FileWriter.truncate.
- */
- function writeImage() {
- var onFileWriterReceived = function(fileWriter) {
- fileWriter.onwrite = logCallback('FileWriter.write', true);
- fileWriter.onerror = logCallback('FileWriter.write', false);
- fileWriter.write("some text!");
- };
-
- var onFileTruncateWriterReceived = function(fileWriter) {
- fileWriter.onwrite = logCallback('FileWriter.truncate', true);
- fileWriter.onerror = logCallback('FileWriter.truncate', false);
- fileWriter.truncate(10);
- };
-
- fileEntry.createWriter(onFileWriterReceived, logCallback('FileEntry.createWriter', false));
- fileEntry.createWriter(onFileTruncateWriterReceived, null);
- };
-
- function displayImageUsingCanvas() {
- var canvas = document.getElementById('canvas');
- var img = document.getElementById('camera_image');
- var w = img.width;
- var h = img.height;
- h = 100 / w * h;
- w = 100;
- canvas.width = w;
- canvas.height= h;
- var context = canvas.getContext('2d');
- context.drawImage(img, 0, 0, w, h);
- };
-
- /**
- * Remove image from library using a NATIVE_URI destination type
- * This calls FileEntry.remove.
- */
- function removeImage() {
- fileEntry.remove(logCallback('FileEntry.remove', true), logCallback('FileEntry.remove', false));
- };
-
- function testInputTag(inputEl) {
+
+ function getVideo(){
clearStatus();
- // iOS 6 likes to dead-lock in the onchange context if you
- // do any alerts or try to remote-debug.
- window.setTimeout(function() {
- testNativeFile2(inputEl);
- }, 0);
- };
-
- function testNativeFile2(inputEl) {
- if (!inputEl.value) {
- alert('No file selected.');
- return;
- }
- fileObj = inputEl.files[0];
- if (!fileObj) {
- alert('Got value but no file.');
- return;
- }
- var URLApi = window.URL || window.webkitURL;
- if (URLApi) {
- var blobURL = URLApi.createObjectURL(fileObj);
- if (blobURL) {
- setPicture(blobURL, function() {
- URLApi.revokeObjectURL(blobURL);
- });
- } else {
- log('URL.createObjectURL returned null');
- }
- } else {
- log('URL.createObjectURL() not supported.');
- }
+ var options = { limit: 1, duration: 10 };
+ navigator.device.capture.captureVideo(captureVideoWin, captureVideoFail, options);
}
-
- function extractOptions() {
- var els = document.querySelectorAll('#image-options select');
- var ret = {};
- for (var i = 0, el; el = els[i]; ++i) {
- var value = el.value;
- if (value === '') continue;
- if (el.isBool) {
- ret[el.keyName] = !!+value;
- } else {
- ret[el.keyName] = +value;
- }
- }
- return ret;
- }
-
- function createOptionsEl(name, values, selectionDefault) {
- var container = document.createElement('div');
- container.style.display = 'inline-block';
- container.appendChild(document.createTextNode(name + ': '));
- var select = document.createElement('select');
- select.keyName = name;
- container.appendChild(select);
-
- // if we didn't get a default value, insert the blank <default> entry
- if (selectionDefault == undefined) {
- var opt = document.createElement('option');
- opt.value = '';
- opt.text = '<default>';
- select.appendChild(opt);
- }
-
- select.isBool = typeof values == 'boolean';
- if (select.isBool) {
- values = {'true': 1, 'false': 0};
- }
-
- for (var k in values) {
- var opt = document.createElement('option');
- opt.value = values[k];
- opt.textContent = k;
- if (selectionDefault) {
- if (selectionDefault[0] == k) {
- opt.selected = true;
- }
- }
- select.appendChild(opt);
- }
- var optionsDiv = document.getElementById('image-options');
- optionsDiv.appendChild(container);
+
+ function clearStatus() {
+ document.getElementById('camera_status').innerHTML = '';
+ document.getElementById('camera_image').src = 'about:blank';
}
/**
@@ -353,18 +118,6 @@
document.addEventListener("deviceready", function() {
deviceReady = true;
console.log("Device="+device.platform+" "+device.version);
- createOptionsEl('sourceType', Camera.PictureSourceType, camPictureSourceTypeDefault);
- createOptionsEl('destinationType', Camera.DestinationType, camDestinationTypeDefault);
- createOptionsEl('encodingType', Camera.EncodingType, camEncodingTypeDefault);
- createOptionsEl('mediaType', Camera.MediaType, camMediaTypeDefault);
- createOptionsEl('quality', {'0': 0, '50': 50, '80': 80, '100': 100}, camQualityDefault);
- createOptionsEl('targetWidth', {'50': 50, '200': 200, '800': 800, '2048': 2048});
- createOptionsEl('targetHeight', {'50': 50, '200': 200, '800': 800, '2048': 2048});
- createOptionsEl('allowEdit', true, camAllowEditDefault);
- createOptionsEl('correctOrientation', true, camCorrectOrientationDefault);
- createOptionsEl('saveToPhotoAlbum', true, camSaveToPhotoAlbumDefault);
- createOptionsEl('cameraDirection', Camera.Direction);
-
}, false);
window.setTimeout(function() {
if (!deviceReady) {
@@ -372,36 +125,26 @@
}
},1000);
};
-
+
</script>
</head>
<body onload="init();" id="stage" class="theme">
- <h1>Camera</h1>
+ <h1>Capture</h1>
<div id="info" style="white-space: pre-wrap">
<b>Status:</b> <div id="camera_status"></div>
img: <img width="100" id="camera_image">
- canvas: <canvas id="canvas" width="1" height="1"></canvas>
+ video: <div id="video_container"></div>
</div>
+
<h2>Cordova Capture API</h2>
<div id="image-options"></div>
- <div class="btn large" onclick="getPicture();">camera.getPicture()</div>
- <h2>Native File Inputs</h2>
- <div>input type=file <input type="file" onchange="testInputTag(this)"></div>
- <div>capture=camera <input type="file" accept="image/*;capture=camera" onchange="testInputTag(this)"></div>
- <div>capture=camcorder <input type="file" accept="video/*;capture=camcorder" onchange="testInputTag(this)"></div>
- <div>capture=microphone <input type="file" accept="audio/*;capture=microphone" onchange="testInputTag(this)"></div>
+
<h2>Actions</h2>
- <div class="btn large" onclick="getFileInfo();">Get File Metadata</div>
- <div class="btn large" onclick="readFile();">Read with FileReader</div>
- <div class="btn large" onclick="copyImage();">Copy Image</div>
- <div class="btn large" onclick="writeImage();">Write Image</div>
- <div class="btn large" onclick="uploadImage();">Upload Image</div>
- <div class="btn large" onclick="displayImageUsingCanvas();">Draw Using Canvas</div>
- <div class="btn large" onclick="removeImage();">Remove Image</div>
-
- <div class="btn large" onclick="getAudio();">Capture and play audio</div>
+ <div class="btn large" onclick="getAudio();">Capture 10 secs of audio and play</div>
+ <div class="btn large" onclick="getImage();">Capture 1 image</div>
+ <div class="btn large" onclick="getVideo();">Capture 10 secs of video</div>
<h2> </h2><div class="backBtn" onclick="backHome();">Back</div>
</body>
</html>