captureImage: function()

in src/browser/CaptureProxy.js [156:234]


    captureImage: function (successCallback, errorCallback, args) {
        const fail = function (code) {
            if (errorCallback) {
                errorCallback(new CaptureError(code || CaptureError.CAPTURE_INTERNAL_ERR));
            }
        };

        const options = args[0];

        const limit = options.limit || 1;
        if (typeof limit !== 'number' || limit < 1) {
            fail(CaptureError.CAPTURE_INVALID_ARGUMENT);
            return;
        }

        // Counter for already taken images
        let imagesTaken = 0;

        navigator.getUserMedia =
            navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

        if (!navigator.getUserMedia) {
            fail(CaptureError.CAPTURE_NOT_SUPPORTED);
            return;
        }

        const ui = new CameraUI();
        ui.startPreview(
            limit,
            function (data) {
                // Check if we're done with capture. If so, then destroy UI
                if (++imagesTaken >= limit) {
                    ui.destroyPreview();
                }

                // Array of resultant MediaFiles
                const mediaFiles = [];

                // save data to file here
                window.requestFileSystem(
                    window.TEMPORARY,
                    data.length * limit,
                    function (fileSystem) {
                        // If we need to capture multiple files, then append counter to filename
                        const fileName = limit <= 1 ? 'image.jpg' : 'image' + imagesTaken + '.jpg';
                        fileSystem.root.getFile(
                            fileName,
                            { create: true },
                            function (file) {
                                file.createWriter(function (writer) {
                                    writer.onwriteend = function () {
                                        file.getMetadata(function (meta) {
                                            mediaFiles.push(
                                                new MediaFile(file.name, file.toURL(), 'image/jpeg', meta.modificationTime, meta.size)
                                            );
                                            // Check if we're done with capture. If so, then call a successCallback
                                            if (imagesTaken >= limit) {
                                                successCallback(mediaFiles);
                                            }
                                        }, fail);
                                    };
                                    writer.onerror = fail;
                                    // Since success callback for start preview returns
                                    // a base64 encoded string, we need to convert it to blob first
                                    writer.write(dataURItoBlob(data));
                                });
                            },
                            fail
                        );
                    },
                    fail
                );
            },
            function (err) {
                ui.destroyPreview();
                fail(err.code);
            }
        );
    },