使用 FirefoxOS 相机拍照 API

Taking picture using FirefoxOS Camera API

我在 FirefoxOS 中使用相机 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 的错误。 我找不到太多关于这个错误的信息,所以我只想在这里查看 Whosebug,看看是否有人遇到过问题/知道这里的问题是什么。

感谢您的帮助!

如果不必是直接从相机拍摄的照片,您可以使用 Pick Activity:

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 });
};

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

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

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

其他一些(不相关的)建议:

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

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

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

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

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

会 select 最接近您的 window 尺寸的匹配预览尺寸,以及与所选可用预览尺寸相匹配的最高宽高比图片尺寸。这与股票相机应用程序的工作方式相同。

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

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

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

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