测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | Apache 2 |
发布最后发布 | 2016年11月 |
由 Holly Schinsky、Shazron Abdullah 维护。
依赖 | |
Cordova | >= 4.3.0 |
cordova-plugin-file | >= 0 |
标题:媒体捕捉
Android | iOS | Windows 8.1 商店 | Windows 8.1 手机 | Windows 10 商店 | Travis CI |
---|---|---|---|---|---|
此插件提供对设备音频、图像和视频捕捉功能的使用。
警告:从设备的相机或麦克风收集和使用图像、视频或音频可能会引发重要的隐私问题。您的应用隐私政策应讨论应用程序如何使用此类传感器以及数据是否与任何其他方共享。此外,如果应用程序在用户界面中未明显使用相机或麦克风,则在应用程序访问相机或麦克风之前(如果设备操作系统尚未完成此操作),应提供即时通知。此通知应提供与上面相同的信息,以及获取用户的允许(例如,通过展示“确定”和“不谢”的选择)。请注意,某些应用市场可能要求您的应用程序在访问相机或麦克风之前提供即时通知并从用户处获取许可。更多信息,请参阅隐私指南。
此插件定义了全局的 navigator.device.capture
对象。
尽管在全局范围内,但在 deviceready
事件之后才可用。
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
console.log(navigator.device.capture);
}
在 Apache Cordova 问题跟踪器上报告此插件的问题。
cordova plugin add cordova-plugin-media-capture
supportedAudioModes:设备支持的音频录制格式。(ConfigurationData[])
supportedImageModes:设备支持的录制图像尺寸和格式。(ConfigurationData[])
supportedVideoModes:设备支持的录制视频分辨率和格式。(ConfigurationData[])
启动音频记录应用程序并返回捕获的音频剪辑文件信息。
navigator.device.capture.captureAudio(
CaptureCB captureSuccess, CaptureErrorCB captureError, [CaptureAudioOptions options]
);
启动一个异步操作,使用设备默认的音频录制应用程序来捕获音频记录。此操作允许设备用户在一个会话中捕获多个记录。
当用户退出音频录制应用程序或达到CaptureAudioOptions.limit
指定的最大录制次数时,捕获操作结束。如果没有指定limit
参数值,则默认为1,且在用户录制一个音频剪辑后捕获操作将终止。
当捕获操作完成后,执行带有描述每个捕获音频剪辑文件的MediaFile
对象的数组CaptureCallback
。如果用户在捕获音频剪辑之前终止操作,则执行带有具有CaptureError.CAPTURE_NO_MEDIA_FILES
错误代码的CaptureErrorCallback
。
// 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});
启动相机应用程序并返回捕获的图像文件信息。
navigator.device.capture.captureImage(
CaptureCB captureSuccess, CaptureErrorCB captureError, [CaptureImageOptions options]
);
启动一个异步操作,使用设备的相机应用程序来捕获图像。此操作允许用户在一个会话中捕获多个图像。
当用户关闭相机应用程序或达到CaptureImageOptions.limit
指定的最大录制次数时,捕获操作结束。如果没有指定limit
值,则默认为1,并且用户捕获一个图像后捕获操作将终止。
当捕获操作完成后,它会调用带有描述每个捕获图像文件的MediaFile
对象的数组CaptureCB
回调。如果用户在捕获图像之前终止操作,则执行带有具有CaptureError.CAPTURE_NO_MEDIA_FILES
错误代码的CaptureErrorCB
回调。
从iOS 10开始,在info.plist中添加NSCameraUsageDescription
、NSMicrophoneUsageDescription
和NSPhotoLibraryUsageDescription
是强制性的。
NSCameraUsageDescription
描述了应用访问用户相机的原因。NSMicrophoneUsageDescription
描述了应用访问用户麦克风的原因。NSPhotoLibraryUsageDescription
描述了应用访问用户照片库的原因。当系统提示用户允许访问时,此字符串将作为对话框的一部分显示。
要添加此条目,您可以在安装插件时传递以下变量。
CAMERA_USAGE_DESCRIPTION
用于NSCameraUsageDescription
MICROPHONE_USAGE_DESCRIPTION
用于NSMicrophoneUsageDescription
PHOTOLIBRARY_USAGE_DESCRIPTION
用于NSPhotoLibraryUsageDescription
示例
cordova plugin add cordova-plugin-media-capture --variable CAMERA_USAGE_DESCRIPTION="您的使用说明消息"
如果不传递变量,插件将添加一个空字符串作为值。
在设备通过Zune连接时调用本机相机应用程序不起作用,并且错误回调执行。
仅在Chrome、Firefox和Opera中工作(因为IE和Safari不支持navigator.getUserMedia API)
仅在Chrome/Opera中可使用捕获文件的URL显示图像。Firefox将捕获的图像存储在IndexedDB存储中(参见文件插件文档),因此显示捕获图像的唯一方法是通过其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});
启动视频录制应用程序,并返回有关捕获的视频剪辑文件的信息。
navigator.device.capture.captureVideo(
CaptureCB captureSuccess, CaptureErrorCB captureError, [CaptureVideoOptions options]
);
启动异步操作,使用设备视频录制应用程序捕获视频记录。该操作允许用户在单次会话中捕获多个录制。
捕获操作在用户退出视频录制应用程序或达到CaptureVideoOptions.limit
指定的最大录制数量时结束。如果没有指定limit
参数值,则默认为1,捕获操作在用户录制单个视频剪辑后终止。
当捕获操作完成后,将执行CaptureCB
回调,并返回一个数组,该数组包含描述每个捕获视频剪辑文件的MediaFile
对象。如果用户在捕获视频剪辑之前终止操作,则执行CaptureErrorCB
回调,回调内容包含一个CaptureError
对象,并带有CaptureError.CAPTURE_NO_MEDIA_FILES
错误代码。
// 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});
CaptureError.CAPTURE_NOT_SUPPORTED
错误代码。封装音频捕获配置选项。
限制:设备用户在单个捕获操作中可以记录的最大音频片段数。该值必须大于或等于1(默认为1)。
持续时间:音频声音片段的最大持续时间,以秒为单位。
// 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);
duration
参数不受支持。无法通过程序限制录制长度。duration
参数不受支持。无法通过程序限制录制长度。duration
参数不受支持。无法通过程序限制录制长度。limit
参数不受支持,因此每次调用只能创建一个录制。limit
参数不受支持,因此每次调用只能创建一个录制。封装图像捕获配置选项。
// limit capture operation to 3 images
var options = { limit: 3 };
navigator.device.capture.captureImage(captureSuccess, captureError, options);
封装视频捕获配置选项。
限制:设备用户在单个捕获操作中可以捕获的最大视频片段数。该值必须大于或等于1(默认为1)。
持续时间:视频片段的最大持续时间,以秒为单位。
// limit capture operation to 3 video clips
var options = { limit: 3 };
navigator.device.capture.captureVideo(captureSuccess, captureError, options);
1
(默认值)表示高质量,值 0
表示低质量,适合短信。有关详细信息,请参阅此处。// limit capture operation to 1 video clip of low quality
var options = { limit: 1, quality: 0 };
navigator.device.capture.captureVideo(captureSuccess, captureError, options);
在成功的媒体捕获操作后调用。
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.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
:请求的捕获操作不受支持。
在媒体捕获操作期间发生错误时调用。
function captureError( CaptureError error ) { ... };
如果尝试启动媒体捕获操作时发生错误,则执行此函数。失败的场景包括捕获应用程序正在忙碌、正在执行捕获操作或用户在捕获任何媒体文件之前取消操作。
此函数将使用包含适当错误code
的CaptureError
对象执行。
// capture error callback
var captureError = function(error) {
navigator.notification.alert('Error code: ' + error.code, null, 'Capture Error');
};
封装了一组设备支持的媒体捕获参数。
描述设备支持的媒体捕获模式。配置数据包括视频或图像捕获的MIME类型和捕获尺寸。
MIME类型应遵循RFC2046。示例
video/3gpp
video/quicktime
image/jpeg
audio/amr
audio/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(
MediaFileDataSuccessCB successCallback,
[MediaFileDataErrorCB errorCallback]
);
该函数尝试异步获取媒体文件的格式信息。如果成功,它将调用带有MediaFileData
对象的MediaFileDataSuccessCB
回调。如果尝试失败,则调用MediaFileDataErrorCB
回调。
访问媒体文件格式信息的API有限,因此并非所有MediaFileData
属性都受到支持。
不提供获取媒体文件信息的API,因此所有MediaFileData
对象都返回默认值。
访问媒体文件格式信息的API有限,因此并非所有MediaFileData
属性都受到支持。
访问媒体文件格式信息的API有限,因此并非所有MediaFileData
属性都受到支持。
封装媒体捕获文件的属性。
name: 文件名,不包括路径信息。(DOMString)
fullPath: 包含名称的完整路径。(DOMString)
type: 文件的MIME类型(DOMString)
lastModifiedDate: 文件最后修改的日期和时间。(Date)
size: 文件的大小,以字节为单位。(Number)
封装关于媒体文件的格式信息。
codecs: 音频和视频内容的实际格式。(DOMString)
bitrate: 内容的平均码率。对于图像,值为零。(Number)
height: 图像或视频的高度(像素)。对于音频片段,值为零。(Number)
width: 图像或视频的宽度(像素)。对于音频片段,值为零。(Number)
duration: 视频或声音剪辑的长度(秒)。对于图像,值为零。(Number)
没有API提供媒体文件的格式信息,因此由MediaFile.getFormatData
返回的MediaFileData
对象具有以下默认值
codecs: 不受支持,并返回null
。
bitrate: 不受支持,并返回零。
height: 不受支持,并返回零。
width: 不受支持,并返回零。
duration: 不受支持,并返回零。
支持以下MediaFileData
属性
codecs: 不受支持,并返回null
。
bitrate: 不受支持,并返回零。
height: 支持:仅图像和视频文件。
width: 支持:仅图像和视频文件。
duration: 支持:仅音频和视频文件。
支持以下MediaFileData
属性
codecs: 不受支持,并返回null
。
bitrate: 不受支持,并返回零。
height: 支持:仅图像和视频文件。
width: 支持:仅图像和视频文件。
duration: 支持:仅音频和视频文件。
支持以下MediaFileData
属性
codecs: 不受支持,并返回null
。
比特率:仅在iOS4设备上支持音频,图像和视频返回零。
height: 支持:仅图像和视频文件。
width: 支持:仅图像和视频文件。
duration: 支持:仅音频和视频文件。
在安卓平台上捕获音频、视频或图像时,有可能应用程序在原生日志捕获应用将Cordova WebView推送到后台后会被销毁。有关此问题的详细描述,请参阅安卓生命周期指南。在这种情况下,传递给捕获方法的成功和失败回调不会触发,而是通过Cordova恢复事件之后的文档事件传递调用结果。
在您的应用程序中,您应该像这样订阅两种可能的事件:
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);
由您跟踪这些结果来自代码的哪个部分。确信在适当的暂停和恢复事件中保存和恢复应用程序的状态。请注意,这些事件仅在安卓平台上触发,并且仅在WebView在捕获操作过程中被销毁时触发。