cordova-plugin-media-capture
Этот плагин предоставляет доступ к возможностям захвата аудио, изображений и видео устройства.
ПРЕДУПРЕЖДЕНИЕ: Сбор и использование изображений, видео или аудио с камеры или микрофона устройства поднимает важные вопросы конфиденциальности. Политика конфиденциальности вашего приложения должна обсуждать, как приложение использует такие датчики и делится ли записанные данные с другими сторонами. Кроме того, если использование камеры или микрофона не очевидно в пользовательском интерфейсе, вы должны предоставить уведомление в режиме реального времени перед доступом приложения к камере или микрофону (если операционная система устройства этого не делает). Это уведомление должно предоставлять ту же информацию, что и выше, а также запрашивать разрешение пользователя (например, предоставляя варианты ОК и Нет, спасибо). Обратите внимание, что некоторые рынки приложений могут потребовать от вашего приложения предоставить уведомление в режиме реального времени и получить разрешение пользователя перед доступом к камере или микрофону. Для получения дополнительной информации, пожалуйста, обратитесь к руководству по конфиденциальности.
Этот плагин определяет глобальный navigator.device.capture объект.
Несмотря на то, что он находится в глобальном пространстве имён, он недоступен до события deviceready.
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
console.log(navigator.device.capture);
}
Установка
cordova plugin add cordova-plugin-media-capture
Поддерживаемые платформы
- Android
- Браузер
- iOS
- Windows
Объекты
- Capture
- CaptureAudioOptions
- CaptureImageOptions
- CaptureVideoOptions
- CaptureCallback
- CaptureErrorCB
- ConfigurationData
- MediaFile
- MediaFileData
Методы
- capture.captureAudio
- capture.captureImage
- capture.captureVideo
- MediaFile.getFormatData
Свойства
supportedAudioModes: Форматы аудиозаписи, поддерживаемые устройством. (ConfigurationData[])
supportedImageModes: Размеры и форматы записываемых изображений, поддерживаемые устройством. (ConfigurationData[])
supportedVideoModes: Разрешения и форматы записи видео, поддерживаемые устройством. (ConfigurationData[])
capture.captureAudio
Запускает приложение аудиозаписи и возвращает информацию о файлах записанных аудиоклипов.
navigator.device.capture.captureAudio(
CaptureCB captureSuccess, CaptureErrorCB captureError, [CaptureAudioOptions options]
);
Описание
Инициализирует асинхронную операцию захвата аудиозаписей с помощью приложения записи звука по умолчанию устройства. Операция позволяет пользователю устройства захватывать несколько записей в одной сессии.
Операция захвата завершается, когда пользователь выходит из приложения аудиозаписи или достигается максимальное количество записей, указанное параметром CaptureAudioOptions.limit. Если параметр limit не указан, он по умолчанию равен одному (1), и операция захвата завершается после записи пользователем одного аудиоклипа.
По завершении операции захвата выполняется CaptureCallback, с массивом объектов MediaFile, описывающих каждый файл записанного аудиоклипа. Если пользователь прерывает операцию до захвата аудиоклипа, выполняется CaptureErrorCallback, с объектом CaptureError, содержащим код ошибки CaptureError.CAPTURE_NO_MEDIA_FILES.
Поддерживаемые платформы
- Android
- iOS
- Windows
Пример
// capture callback
var captureSuccess = function(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
}
};
// capture error callback
var captureError = function(error) {
navigator.notification.alert('Error code: ' + error.code, null, 'Capture Error');
};
// start audio capture
navigator.device.capture.captureAudio(captureSuccess, captureError, {limit:2});
Особенности iOS
- В iOS нет приложения для записи звука по умолчанию, поэтому предоставляется простой пользовательский интерфейс.
Особенности Windows Phone 7 и 8
- В Windows Phone 7 нет приложения для записи звука по умолчанию, поэтому предоставляется простой пользовательский интерфейс.
capture.captureImage
Запускает приложение камеры и возвращает информацию о файлах полученных изображений.
navigator.device.capture.captureImage(
CaptureCB captureSuccess, CaptureErrorCB captureError, [CaptureImageOptions options]
);
Описание
Инициализирует асинхронную операцию захвата изображений с помощью приложения камеры устройства. Операция позволяет пользователям захватить более одного изображения в одной сессии.
Операция захвата завершается, либо когда пользователь закрывает приложение камеры, либо когда достигается максимальное количество записей, указанное параметром CaptureImageOptions.limit. Если значение параметра limit не указано, оно по умолчанию равно одному (1), и операция захвата завершается после захвата пользователем одного изображения.
По окончании операции захвата вызывается обратный вызов CaptureCB с массивом объектов MediaFile, описывающих каждый файл захваченного изображения. Если пользователь прерывает операцию до захвата изображения, вызывается обратный вызов CaptureErrorCB с объектом CaptureError, содержащим код ошибки CaptureError.CAPTURE_NO_MEDIA_FILES.
Поддерживаемые платформы
- Android
- Браузер
- iOS
- Windows
Особенности iOS
Начиная с iOS 10, обязательно предоставлять описание использования в info.plist, если вы пытаетесь получить доступ к данным, требующим повышенной конфиденциальности. Когда система предложит пользователю разрешить доступ, эта строка описания использования будет отображаться в диалоговом окне запроса разрешений. Но если вы не предоставили описание использования, приложение аварийно завершит работу до показа диалога. Кроме того, Apple отклонит приложения, которые получают доступ к конфиденциальным данным, но не предоставляют описание использования.
Этот плагин требует следующих описаний использования:
-
NSCameraUsageDescriptionописывает причину доступа приложения к камере пользователя. -
NSMicrophoneUsageDescriptionописывает причину доступа приложения к микрофону пользователя. -
NSPhotoLibraryUsageDescriptionentryописывает причину доступа приложения к фотобиблиотеке пользователя.
Чтобы добавить эти записи в info.plist, вы можете использовать тег edit-config в config.xml, как показано ниже:
<edit-config target="NSCameraUsageDescription" file="*-Info.plist" mode="merge">
<string>need camera access to take pictures</string>
</edit-config>
<edit-config target="NSMicrophoneUsageDescription" file="*-Info.plist" mode="merge">
<string>need microphone access to record sounds</string>
</edit-config>
<edit-config target="NSPhotoLibraryUsageDescription" file="*-Info.plist" mode="merge">
<string>need to photo library access to get pictures from there</string>
</edit-config>
Особенности браузера
Работает только в Chrome, Firefox и Opera (т.к. IE и Safari не поддерживают API navigator.getUserMedia)
Отображение изображений с использованием URL захваченного файла доступно только в Chrome/Opera. Firefox сохраняет захваченные изображения в хранилище IndexedDB (см. документацию плагина File), и поэтому единственный способ отобразить захваченное изображение — это прочитать его и отобразить с помощью его DataURL.
Пример
// capture callback
var captureSuccess = function(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
}
};
// capture error callback
var captureError = function(error) {
navigator.notification.alert('Error code: ' + error.code, null, 'Capture Error');
};
// start image capture
navigator.device.capture.captureImage(captureSuccess, captureError, {limit:2});
capture.captureVideo
Запускает приложение видеозаписи и возвращает информацию о файлах записанных видеоклипов.
navigator.device.capture.captureVideo(
CaptureCB captureSuccess, CaptureErrorCB captureError, [CaptureVideoOptions options]
);
Описание
Инициализирует асинхронную операцию захвата видеозаписей с помощью приложения видеозаписи устройства. Операция позволяет пользователю захватывать более одной записи в одной сессии.
Операция захвата завершается, когда пользователь выходит из приложения видеозаписи или достигается максимальное количество записей, указанное параметром CaptureVideoOptions.limit. Если параметр limit не указан, он по умолчанию равен одному (1), и операция захвата завершается после записи пользователем одного видеоклипа.
По окончании операции захвата вызывается обратный вызов CaptureCB с массивом объектов MediaFile, описывающих каждый файл записанного видеоклипа. Если пользователь прерывает операцию до захвата видеоклипа, вызывается обратный вызов CaptureErrorCB с объектом CaptureError, содержащим код ошибки CaptureError.CAPTURE_NO_MEDIA_FILES.
Поддерживаемые платформы
- Android
- iOS
- Windows
Пример
// capture callback
var captureSuccess = function(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
}
};
// capture error callback
var captureError = function(error) {
navigator.notification.alert('Error code: ' + error.code, null, 'Capture Error');
};
// start video capture
navigator.device.capture.captureVideo(captureSuccess, captureError, {limit:2});
CaptureAudioOptions
Содержит параметры конфигурации для аудиозахвата.
Свойства
limit: Максимальное количество аудиоклипов, которые пользователь может записать в одной операции захвата. Значение должно быть больше или равно 1 (по умолчанию 1).
duration: Максимальная продолжительность аудиоклипа в секундах.
Пример
// limit capture operation to 3 media files, no longer than 10 seconds each
var options = { limit: 3, duration: 10 };
navigator.device.capture.captureAudio(captureSuccess, captureError, options);
Особенности Android
- Параметр
durationне поддерживается. Длительность записи программно ограничить нельзя.
Особенности iOS
- Параметр
limitне поддерживается, поэтому для каждого вызова можно создать только одну запись.
CaptureImageOptions
Содержит параметры конфигурации для захвата изображений.
Свойства
- limit: Максимальное количество изображений, которые пользователь может захватить в одной операции захвата. Значение должно быть больше или равно 1 (по умолчанию 1).
Пример
// limit capture operation to 3 images
var options = { limit: 3 };
navigator.device.capture.captureImage(captureSuccess, captureError, options);
Особенности iOS
- Параметр limit не поддерживается, и захватывается только одно изображение за вызов.
CaptureVideoOptions
Содержит параметры конфигурации для захвата видео.
Свойства
limit: Максимальное количество видеоклипов, которые пользователь может захватить в одной операции захвата. Значение должно быть больше или равно 1 (по умолчанию 1).
duration: Максимальная продолжительность видеоклипа в секундах.
Пример
// limit capture operation to 3 video clips
var options = { limit: 3 };
navigator.device.capture.captureVideo(captureSuccess, captureError, options);
Особенности iOS
- Свойство limit игнорируется. Запись одного видео выполняется за один вызов.
Особенности Android
- Android поддерживает дополнительное свойство quality, позволяющее захватывать видео с разной степенью качества. Значение
1(по умолчанию) означает высокое качество, а значение0означает низкое качество, подходящее для сообщений MMS. См. здесь для получения более подробной информации.
Пример (Android с качеством)
// limit capture operation to 1 video clip of low quality
var options = { limit: 1, quality: 0 };
navigator.device.capture.captureVideo(captureSuccess, captureError, options);
CaptureCB
Вызывается при успешной операции захвата медиа.
function captureSuccess( MediaFile[] mediaFiles ) { ... };
Описание
Эта функция выполняется после успешного завершения операции захвата. В этот момент медиафайл был захвачен, и либо пользователь вышел из приложения захвата медиа, либо было достигнуто ограничение захвата.
Каждый объект MediaFile описывает захваченный медиафайл.
Пример
// capture callback
function captureSuccess(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
}
};
CaptureError
Содержит код ошибки, возникшей при неудачной операции захвата медиа.
Свойства
- code: Один из предопределенных кодов ошибок, перечисленных ниже.
Постоянные значения
CaptureError.CAPTURE_INTERNAL_ERR: Камера или микрофон не смогли захватить изображение или звук.CaptureError.CAPTURE_APPLICATION_BUSY: Приложение для захвата камеры или аудио в данный момент обрабатывает другой запрос захвата.CaptureError.CAPTURE_INVALID_ARGUMENT: Некорректное использование API (например, значениеlimitменьше единицы).CaptureError.CAPTURE_NO_MEDIA_FILES: Пользователь закрывает приложение для захвата камеры или аудио, прежде чем что-либо захватить.CaptureError.CAPTURE_PERMISSION_DENIED: Пользователь отказался от разрешения, необходимого для выполнения данного запроса на захват.CaptureError.CAPTURE_NOT_SUPPORTED: Запрашиваемая операция захвата не поддерживается.
CaptureErrorCB
Вызывается, если при операции захвата медиаданных произошла ошибка.
function captureError( CaptureError error ) { ... };
Описание
Эта функция выполняется, если при попытке запуска операции захвата медиаданных произошла ошибка. К сценариям сбоев относятся случаи, когда приложение захвата занято, операция захвата уже выполняется или пользователь отменяет операцию, прежде чем какие-либо медиафайлы будут захвачены.
Эта функция выполняется с объектом CaptureError , содержащим соответствующую ошибку code.
Пример
// capture error callback
var captureError = function(error) {
navigator.notification.alert('Error code: ' + error.code, null, 'Capture Error');
};
ConfigurationData
Инкапсулирует набор параметров захвата медиаданных, поддерживаемых устройством.
Описание
Описывает режимы захвата медиаданных, поддерживаемые устройством. Данные конфигурации включают тип MIME и размеры захвата для видео или изображения.
Типы MIME должны соответствовать RFC2046. Примеры:
video/3gppvideo/quicktimeimage/jpegaudio/amraudio/wav
Свойства
type: Строка ASCII, кодированная строка нижнего регистра, представляющая тип медиаданных. (DOMString)
height: Высота изображения или видео в пикселях. Значение равно нулю для звуковых файлов. (Число)
width: Ширина изображения или видео в пикселях. Значение равно нулю для звуковых файлов. (Число)
Пример
// retrieve supported image modes
var imageModes = navigator.device.capture.supportedImageModes;
// Select mode that has the highest horizontal resolution
var width = 0;
var selectedmode;
for each (var mode in imageModes) {
if (mode.width > width) {
width = mode.width;
selectedmode = mode;
}
}
Не поддерживается ни одной платформой. Все массивы данных конфигурации пусты.
MediaFile.getFormatData
Извлекает информацию о формате файла захвата медиаданных.
mediaFile.getFormatData(
MediaFileDataSuccessCB successCallback,
[MediaFileDataErrorCB errorCallback]
);
Описание
Эта функция асинхронно пытается извлечь информацию о формате медиафайла. В случае успеха она вызывает коллбек MediaFileDataSuccessCB с объектом MediaFileData. В случае неудачи эта функция вызывает коллбек MediaFileDataErrorCB.
Поддерживаемые платформы
- Android
- iOS
- Windows
Особенности Android
API для доступа к информации о формате медиафайла ограничен, поэтому не все свойства MediaFileData поддерживаются.
Особенности iOS
API для доступа к информации о формате медиафайла ограничен, поэтому не все свойства MediaFileData поддерживаются.
MediaFile
Инкапсулирует свойства файла захвата медиаданных.
Свойства
name: Имя файла без информации о пути. (DOMString)
fullPath: Полный путь к файлу, включая имя. (DOMString)
type: Тип MIME файла (DOMString)
lastModifiedDate: Дата и время последнего изменения файла. (Дата)
size: Размер файла в байтах. (Число)
Методы
- MediaFile.getFormatData: Извлекает информацию о формате медиафайла.
MediaFileData
Инкапсулирует информацию о формате медиафайла.
Свойства
codecs: Фактический формат аудио и видео содержимого. (DOMString)
bitrate: Средняя битрейт содержимого. Значение равно нулю для изображений. (Число)
height: Высота изображения или видео в пикселях. Значение равно нулю для аудиоклипов. (Число)
width: Ширина изображения или видео в пикселях. Значение равно нулю для аудиоклипов. (Число)
duration: Длительность видео или аудиоклипа в секундах. Значение равно нулю для изображений. (Число)
Особенности Android
Поддерживает следующие MediaFileData свойства:
codecs: Не поддерживается и возвращает
null.bitrate: Не поддерживается и возвращает ноль.
height: Поддерживается: только для файлов изображений и видео.
width: Поддерживается: только для файлов изображений и видео.
duration: Поддерживается: только для аудио и видео файлов.
Особенности iOS
Поддерживает следующие MediaFileData свойства:
codecs: Не поддерживается и возвращает
null.bitrate: Поддерживается на устройствах iOS4 только для аудио. Возвращает ноль для изображений и видео.
height: Поддерживается: только для файлов изображений и видео.
width: Поддерживается: только для файлов изображений и видео.
duration: Поддерживается: только для аудио и видео файлов.
Особенности жизненного цикла Android
При захвате аудио, видео или изображений на платформе Android существует вероятность, что приложение будет уничтожено после того, как Cordova Webview будет переведён в фоновый режим приложением захвата нативного уровня. Подробное описание проблемы см. в руководстве по жизненному циклу Android Lifecycle Guide. В этом случае обработчики успешного и неудачного завершения, переданные методу захвата, не будут вызваны, и результаты вызова будут переданы через событие документа, которое срабатывает после события Cordova resume event.
В вашем приложении вам следует подписаться на два возможных события, например, так:
function onDeviceReady() {
// pendingcaptureresult is fired if the capture call is successful
document.addEventListener('pendingcaptureresult', function(mediaFiles) {
// Do something with result
});
// pendingcaptureerror is fired if the capture call is unsuccessful
document.addEventListener('pendingcaptureerror', function(error) {
// Handle error case
});
}
// Only subscribe to events after deviceready fires
document.addEventListener('deviceready', onDeviceReady);
Вам нужно отслеживать, откуда поступают эти результаты в вашем коде. Не забудьте сохранить и восстановить состояние вашего приложения в рамках событий pause и resume, как это необходимо. Обратите внимание, что эти события будут сработаны только на платформе Android и только в том случае, если Webview был уничтожен во время операции захвата.
© 2012, 2013, 2015 The Apache Software Foundation
Licensed under the Apache License 2.0.
https://cordova.apache.org/docs/en/9.x/reference/cordova-plugin-media-capture/index.html