2013-09-03 2 views
0

По какой-то причине мой код не может получить объект IAsyncOperation, который возвращается при вызове метода captureFileAsync метода Windows.Media.Capture.CameraCaptureUI(). Объект IAsyncOperation возвращается в соответствии с this documentation. В этой связи документации, говорится:CameraCaptureUI.captureFileAsync не возвращает объект IAsyncOperation

Return value 
Type: IAsyncOperation<StorageFile> 
When this operationcompletes, a StorageFile object is returned. 

Так вот мой код:

var dialog = new Windows.Media.Capture.CameraCaptureUI(); 
var aspectRatio = { width: 4, height: 3 }; 

dialog.photoSettings.croppedAspectRatio = aspectRatio; 
appSession.InAsyncMode = dialog.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo).done(function (file) { 
     if (file) { 
      self.addPage(URL.createObjectURL(file)); 
     } else { 
      WinJS.log && WinJS.log("No photo captured.", "sample", "status"); 
     } 
    }, function (err) { 
      // None taken 
    }); 

Когда я проверить значение appSession.InAysncMode, я вижу, что функция возвращает undefined. Я подозреваю, что он возвращает undefined, потому что операция не завершена (т. Е. Пользователь еще не создал фотографию, и она не была сохранена на диске), но мне она нужна, чтобы программно отказаться от режима захвата камеры. Кто-нибудь знает, почему он будет возвращать undefined, а не документированный объект IAsyncOperation?

Спасибо!

+0

должны любить Win8 город-призрак ... – ariestav

+0

Я решил опубликовать этот вопрос на этих форумах и получил ответ через день! http://social.msdn.microsoft.com/Forums/windowsapps/en-US/e8e77027-6416-4b08-8ca4-bc7ecab885d4/why-does-cameracaptureuicapturefileasync-fail-to-return-iasyncoperation-object – ariestav

ответ

1

Для справки, вот ответ, который я разместил на форуме MSDN.

Чтобы ответить на окончательный вопрос, вы можете отменить пользовательский интерфейс захвата, отменив обещание от dialog.captureFileAsync.

Ваш флаг InAsyncMode не определен, потому что вы назначаете ему возвращаемое значение из captureFileAsync.done(), которое по определению не определено. Это не имеет никакого отношения к успеху API.

В документах, когда вы видите IAsyncOperation, то, что вы получаете в JavaScript, является обещанием, которое в результате приведет к завершенному обработчику, если оно будет успешным. Вы никогда не видите IAsyncOperation или связанные с ним интерфейсы в JavaScript. Документация для WinRT написана как нейтральная по отношению к языку, поэтому важно понять, как эти вещи появляются в JS (как обещания). В C# вы тоже этого не видите, так как вы просто используете ключевое слово ожидания. В основном на C++ вы сталкиваетесь с интерфейсом.

Во всяком случае, вы, я полагаю, вы хотите что-то вдоль линий коды ниже, где вы могли бы устранить IsAsyncMode в пользу только проверки ненулевого обещания:

appSession.capturePromise = dialog.captureFileAsync(Windows.Media.Capture.CameraCaptureUIMode.photo); 
appSession.IsAsyncMode = (appSession.capturePromise != null); 


//This will close the capture UI after 5 seconds--replace with whatever logic you need 
setTimeout(function() { appSession.capturePromise.cancel(); }, 5000); 

appSession.capturePromise.done(function (file) { 
    if (file) { 
    } else { 
    } 
}, function (err) { 
    appSession.IsAsyncMode = false; 
    appSession.capturePromise = null; 
}); 
Смежные вопросы