使用FirefoxOS Camera API拍照

时间:2015-05-28 14:45:41

标签: javascript firefox-os

我在FirefoxOS中使用Camera API时遇到了一些问题。我试图像这样拍照:

var options = {
    mode: 'picture',
    recorderProfile: 'jpg',
    previewSize: {
        width: 352,
        height: 288
    }
};
function successCamera(newCamera) {
    console.log("Succeeded loading camera");
    function successPicture(pictureBlob){
        console.log("Took picture");
    }
    function errorPicture(error) { console.log("Issue taking picture " + error); }
    var picture = newCamera.takePicture(options, successPicture, errorPicture);
}
function errorCamera(error) {
    console.log("Error loading camera. " + error);
    console.warn(error);
}
navigator.mozCameras.getCamera("back", options, successCamera, errorCamera);

它给出了一个名为:HardwareClosed的错误。 我无法找到关于此错误的更多信息,所以我只想在这里查看StackOverflow,看看是否有人遇到过问题/知道这里有什么问题。

感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:2)

可以通过getCamera和takePicture调用返回HardwareClosed(内部映射到NS_ERROR_NOT_INITIALIZED)。

如果getCamera调用失败,可能是因为相机已经打开(在此应用程序中,或在另一个应用程序中),需要先将其释放。在Firefox OS的未来版本中,这将由https://bugzilla.mozilla.org/show_bug.cgi?id=1073017修复,以便新应用程序可以从旧版本“获取”相机。

如果是takePicture调用失败(可能不是你的情况),那是因为在你调用takePicture之前相机已经被释放了。那将是你被称为释放或一些驱动程序错误迫使相机关闭。

其他一些(无关的)建议:

请注意,recorderProfile无效。这样的事情会更合适:

var options = {
    mode: 'picture',
    recorderProfile: 'high',
    previewSize: {
        width: 352,
        height: 288
    }
};

Firefox OS的更高版本(最新2.2版,主版)验证recorderProfile,如果您提供'jpg',则会拒绝配置。

在更高版本的相机API中删除了回调语法,并将其切换为promises和事件。如果您能够将2.2版本升级到最新版本(今年的版本),它会自动为您选择最佳配置,即:

navigator.mozCameras.getCamera("back").then(successCamera, errorCamera);

会根据您选择的预览尺寸选择与您的窗口尺寸最匹配的预览尺寸以及匹配图片尺寸的最高宽高比。这与库存相机应用程序的工作方式相同。

takePicture和getCamera使用不同的选项(有些重叠),但由于你没有使用任何一个用于takePicture,null应该足够了:

var picture = newCamera.takePicture().then(successPicture, errorPicture);

var picture = newCamera.takePicture(null, successPicture, errorPicture);

如果你想同时支持promise和回调API版本,你可以像这个应用程序一样检查Firefox OS版本:https://github.com/texthtml/torch/blob/master/src/index.js#L69

答案 1 :(得分:1)

如果它不是直接来自相机的照片,您可以使用选择活动:

var pick = new MozActivity({
    name: "pick",
    data: {type: ["image/*"]}
});
pick.onsuccess = function () {
    console.log('import pick success', this.result.type, this.result.blob );
    app.importImageFile(this.result.blob);
};
pick.onerror = function () {
    var userMsg;
    console.error('import pick error', this.error);
    switch (this.error.name) {
        case 'ActivityCanceled':
            return;
        case 'NO_PROVIDER':
            userMsg = $L('No external sources for images.');
            break;
        default:
            userMsg = this.error.message || this.error.name || this.error.toString();
    }
    enyo.Signals.send('onShowMessage', {message: userMsg });
};