获得该设备的当前朝向。
方法:
- compass.getCurrentHeading
- compass.watchHeading
-
compass.clearWatch
参数:
- compassSuccess
- compassError
-
compassOptions
compass.getCurrentHeading
获取罗盘的当前朝向。
简单的范例:
通过compassSuccess回调函数返回罗盘朝向数据
支持的平台:
- Android
-
iPhone
简单的范例:
compass.watchHeading每隔固定时间就获取一次设备的当前朝向。每次取得朝向后,headingSuccess回调函数会被执行。通过compassOptions对象的frequency参数可以设定以毫秒为单位的时间间隔。
返回的watch ID是罗盘监视周期的引用,可以通过compass.clearWatch调用该watch ID以停止对罗盘的监视。
支持的平台:
- Android
-
iPhone
简单的范例:
-
watchID: 由compass.watchHeading返回的引用标示。
支持的平台:
- Android
-
iPhone
简单的范例:
-
heading:在某一时刻的罗盘朝向角度 (从0度到359.99度之间)。(数字类型)
选项:
-
frequency:多少毫秒获取一次罗盘朝向。(数字类型)(默认值:100)
本文来自:http://blog.csdn.net/phonegapcn
提供对设备音频、图像和视频采集功能的访问。
对象:
- Capture
- CaptureAudioOptions
- CaptureImageOptions
- CaptureVideoOptions
- CaptureCB
- CaptureErrorCB
- ConfigurationData
- MediaFile
-
MediaFileData
方法:
- capture.captureAudio
- capture.captureImage
- capture.captureVideo
-
MediaFile.getFormatData
范围:
capture对象被分配给navigator.device对象,因此作用域为全局范围。
简单的范例:
属性:
- supportedAudioModes:当前设备所支持的音频录制格式。(ConfigurationData[] 类型)
- supportedImageModes:当前设备所支持的拍摄图像尺寸及格式。(ConfigurationData[] 类型)
-
supportedVideoModes:当前设备所支持的拍摄视频分辨率及格式。(ConfigurationData[] 类型)
方法:
- capture.captureAudio:启动设备录制音频剪辑的音频录制应用程序。
- capture.captureImage:启动设备拍摄照片的摄像头应用程序。
-
capture.captureVideo:启动设备拍摄视频的视频录制应用程序。
支持的平台:
- Android
- BlackBerry WebWorks (OS 5.0或更高版本)
-
iOS
capture.captureAudio
启动录音机应用程序并返回采集的音频剪辑文件。
说明:
该方法通过设备默认的音频录制应用程序开始一个异步操作以采集音频录制。该操作允许设备用户在一个会话中同时采集多个录音。
当用户退出音频录制应用程序,或系统到达CaptureAudioOptions的limit参数所定义的最大录制数时都会停止采集操作。如果没有设置limit参数的值,则使用其默认值1,也就是说当用户录制好一个音频剪辑后采集操作就会终止。
当采集操作结束后,系统会调用CaptureCB回调函数,传递一个包含所有采集到的音频剪辑文件的MediaFile对象数组。如果用户在完成一个音频剪辑采集之前终止采集操作,系统会调用CaptureErrorCB回调函数,并传递一个包含CaptureError.CAPTURE_NO_MEDIA_FILES错误代码的CaptureError对象。
支持的平台:
- Android
- BlackBerry WebWorks (OS 5.0或更高版本)
-
iOS
简单的范例:
BlackBerry WebWorks的特异情况:
-
在BlackBerry WebWorks上,PhoneGap会尝试启动RIM提供的Voice Notes Recorder应用程序来采集音频录制。如果设备没有安装该应用程序,开发者会收到一个CaptureError.CATURE_NOT_SUPPORTED错误代码。
iOS的特异情况:
-
iOS没有默认的音频录制应用程序,因此仅提供一个简单的用户界面。
CaptureAudioOptions
封装音频采集的配置选项。
属性:
- limit:在单个采集操作期间能够记录的音频剪辑数量最大值,必须设定为大于等于1(默认值为1)。
- drration:一个音频剪辑的最长时间,单位为秒。
-
mode:选定的音频模式,必须设定为capture.supportedAudioModes枚举中的值。
简单的范例:
Android的特异情况:
- 不支持duration参数,无法通过程序限制录制长度。
-
不支持mode参数,无法通过程序修改音频录制格式。使用自适应多速率(AMR)格式(audio/amr)进行音频录制编码。
BlackBerry WebWorks的特异情况:
- 不支持duration参数,无法通过程序限制录制长度。
-
不支持mode参数,无法通过程序修改音频录制格式。使用自适应多速率(AMR)格式(audio/amr)进行音频录制编码。
iOS的特异情况:
- 不支持limit参数,每次调用只能创建一个录制。
-
不支持mode参数,无法通过程序修改音频录制格式。使用波形音频(WAV)格式(audio/wav)进行音频录制编码。
capture.captureImage
[url=]开启摄像头应用程序,返回采集到的图像文件信息。
[/url]
封装图像采集的配置选项。
属性:
- limit: 在单个采集操作期间能够采集的图像数量最大值,必须设定为大于等于1(默认值为1)。
-
mode: 选定的图像模式,必须设定为capture.supportedImageModes枚举中的值。
简单的范例:
Android的特异情况:
-
不支持mode参数,无法通过程序修改图像的大小和格式。不过设备用户可以修改图像的大小,图像会以JPEG格式(image/jpeg)存储。
BlackBerry WebWorks的特异情况:
-
不支持mode参数,无法通过程序修改图像的大小和格式。不过设备用户可以修改图像的大小,图像会以JPEG格式(image/jpeg)存储。
iOS的特异情况:
- 不支持limit参数,每调用一次采集一幅图像。
-
不支持mode参数,无法通过程序修改图像的大小和格式。图像会以JPEG格式(image/jpeg)存储。
capture.captureVideo
开启视频录制应用程序,返回采集到的视频剪辑文件信息。
说明:
该方法通过设备的视频录制应用程序开始一个异步操作以采集视频录制。该操作允许设备用户在一个会话中同时采集多个视频录制。
当用户退出视频录制应用程序,或系统到达CaptureVideoOptions的limit参数所定义的最大录制数时都会停止采集操作。如果没有设置limit参数的值,则使用其默认值1,也就是说当用户录制到一个视频剪辑后采集操作就会终止。
当采集操作结束后,系统会调用CaptureCB回调函数,传递一个包含每个采集到的视频剪辑文件的MediaFile对象数组。如果用户在完成一个视频剪辑采集之前终止采集操作,系统会调用CaptureErrorCB回调函数,并传递一个包含CaptureError.CAPTURE_NO_MEDIA_FILES错误代码的CaptureError对象。
支持的平台:
- Android
- BlackBerry WebWorks (OS 5.0或更高版本)
-
iOS
简单的范例:
-
在BlackBerry WebWorks上,PhoneGap会尝试启动RIM提供的Video Recorder应用程序来采集视频录制。如果设备没有安装该应用程序,开发者会收到一个CaptureError.CATURE_NOT_SUPPORTED错误代码。
CaptureVideoOptions
封装视频采集的配置选项
属性:
- limit:在单个采集操作期间能够采集的视频剪辑数量最大值,必须设定为大于等于1(默认值为1)。
- drration: 一个视频剪辑的最长时间,单位为秒。
-
mode: 选定的视频采集模式,必须设定为capture.supportedVideoModes枚举中的值。
简单的范例:
- 不支持duration参数,无法通过程序限制录制长度。
-
不支持mode参数,无法通过程序修改视频的大小和格式。不过,设备用户可以修改这些参数,默认情况下视频会以3GPP格式(video/3gpp)存储。
BlackBerry WebWorks的特异情况:
- 不支持duration参数,无法通过程序限制录制长度。
-
不支持mode参数,无法通过程序修改视频的大小和格式。不过,设备用户可以修改这些参数,默认情况下视频会以3GPP(video/3gpp)格式存储。
iOS的特异情况:
- 不支持limit参数,每调用一次采集一个视频。
- 不支持duration参数,无法通过程序限制录制长度。
-
不支持mode参数,无法通过程序修改视频的大小和格式。默认情况下视频会以MOV(video/3gpp)格式存储。
CaptureCB
媒体采集成功后调用的回调函数。
每个MediaFile对象都指向一个采集到的媒体文件。
简单的范例:
媒体采集操作发生错误后调用的回调函数。
该函数调用时会传递一个包含相应错误代码的CaptureError对象。
简单的范例:
ConfigurationData “
封装设备支持的媒体采集参数集。
说明:
该对象用于描述设备所支持的媒体采集模式,配置数据包括MIME类型和采集尺寸(适用于视频和图像采集)。
MIME类型应该符合RFC2046规范,例如:
- video/3gpp
- video/quicktime
- image/jpeg
- audio/amr
-
audio/wav
属性:
- type:用小写ASCII编码字符串表示的媒体类型。(DOMString格式)
- height: 用像素表示的图像或视频高度,音频剪辑为0。(数字类型)
-
width: 用像素表示的图像或视频宽度,音频剪辑为0。(数字类型)
简单的范例:
没有任何一个平台支持,所有配置数据数组都为空。
MediaFile
封装采集到的媒体文件的属性。
属性:
- name:不含路径信息的文件名。(DOMString类型)
- fullPath: 包含文件名的文件全路径。(DOMString类型)
- type: MIME类型。(DOMString类型)
- lastModifiesDate:文件最后修改的日期和时间。(日期类型)
-
size:以字节数表示的文件大小。(数字类型)
方法:
-
MediaFile.getFormatData: 获取媒体文件的格式信息
MediaFile.getFormatData
获取采集到的媒体文件的格式信息。
说明:该方法通过异步方式尝试获取媒体文件的格式信息。获取成功的情况下该方法会调用MediaFileDataSuccessCB回调并传递一个MediaFileData对象,尝试失败的情况下该方法会调用MediaFileDataErrorCB回调。
支持的平台:
- Android
- BlackBerry WebWorks (OS 5.0或更高版本)
-
iOS
BlackBerry WebWorks的特异情况:
-
没有提供媒体文件格式信息的API,因此,所有MediaFileData对象都会返回默认值。参考MediaFileData文档。
Android的特异情况:
-
获取媒体文件格式信息的API受到限制,因此,不是所有的MediaFileData属性都支持。参考MediaFileData文档。
iOS的特异情况:
-
获取媒体文件格式信息的API受到限制,因此,不是所有的MediaFileData属性都支持。参考MediaFileData文档。
MediaFileData
封装媒体文件的格式信息。
属性:
- codecs: 音频及视频内容的实际格式。(DOMString类型)
- bitrate:文件内容的平均比特率。对于图像文件,属性值为0。(数字类型)
- height: 用像素表示的图像或视频高度,音频剪辑的该属性值为0。(数字类型)
- width: 用像素表示的图像或视频的宽度,音频剪辑的该属性值为0。(数字类型)
-
duration: 以秒为单位的视频或音频剪辑时长,图像文件的该属性值为0。(数字类型)
BlackBerry WebWorks的特异情况:
没有提供媒体文件格式信息的API,因此MediaFile.getFormatData方法返回的MediaFileData对象包含以下默认值:
- codecs: 不支持,该属性始终为空。
- bitrate:不支持,该属性始终为0。
- heigh: 不支持,该属性始终为0。
- width: 不支持,该属性始终为0。
-
duration: 不支持,该属性始终为0。
Android的特异情况:
MediaFileData属性的支持情况如下:
- codecs:不支持,该属性始终为空。
- bitrate:不支持,该属性始终为0。
- height:支持(仅限图像或视频文件)。
- width:支持(仅限图像或视频文件)。
-
duration:支持(仅限音频或视频文件)。
iOS的特异情况:
MediaFileData属性的支持情况如下:
- codecs:不支持,该属性始终为空。
- bitrate:iOS4设备上仅支持音频,对于图像和视频此属性值为0。
- height:支持(仅限图像或视频文件)。
- width:支持(仅限图像或视频文件)。
-
duration: 支持(仅限音频或视频文件)。
本文来自:http://blog.csdn.net/phonegapcn
.h文件
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioQueue.h>
#import <AudioToolbox/AudioServices.h>
@interface SCListener : NSObject {
AudioQueueLevelMeterState *levels;
AudioQueueRef queue;
AudioStreamBasicDescription format;
Float64 sampleRate;
}
+ (SCListener *)sharedListener;
- (void)listen;
- (BOOL)isListening;
- (void)pause;
- (void)stop;
- (Float32)averagePower;
- (Float32)peakPower;
- (AudioQueueLevelMeterState *)levels;
@end
.m文件
#import "SCListener.h"
@interface SCListener(Private)
-(void)updateLevels;
-(void)setupQueue;
-(void)setupFormat;
-(void)setupBuffers;
-(void)setupMetering;
@end
static SCListener *sharedListener = nil;
static void listeningCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumberPacketsDescriptions, const AudioStreamPacketDescription *inPacketDescs) {
SCListener *listener = (SCListener *)inUserData;
if ([listener isListening])
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}
@implementation SCListener
+ (SCListener *)sharedListener {
@synchronized(self) {
if (sharedListener == nil)
[[self alloc] init];
}
return sharedListener;
}
- (void)dealloc {
[sharedListener stop];
[super dealloc];
}
#pragma mark -
#pragma mark Listening
- (void)listen {
if (queue == nil)
[self setupQueue];
AudioQueueStart(queue, NULL);
}
- (void)pause {
if (![self isListening])
return;
AudioQueueStop(queue, true);
}
- (void)stop {
if (queue == nil)
return;
AudioQueueDispose(queue, true);
queue = nil;
}
- (BOOL)isListening {
if (queue == nil)
return NO;
UInt32 isListening, ioDataSize = sizeof(UInt32);
OSStatus result = AudioQueueGetProperty(queue, kAudioQueueProperty_IsRunning, &isListening, &ioDataSize);
return (result != noErr) ? NO : isListening;
}
#pragma mark -
#pragma mark Levels getters
- (Float32)averagePower {
if (![self isListening])
return 0.0;
return [self levels][0].mAveragePower;
}
- (Float32)peakPower {
if (![self isListening])
return 0.0;
return [self levels][0].mPeakPower;
}
- (AudioQueueLevelMeterState *)levels {
if (![self isListening])
return nil;
[self updateLevels];
return levels;
}
- (void)updateLevels {
UInt32 ioDataSize = format.mChannelsPerFrame * sizeof(AudioQueueLevelMeterState);
AudioQueueGetProperty(queue, (AudioQueuePropertyID)kAudioQueueProperty_CurrentLevelMeter, levels, &ioDataSize);
}
#pragma mark -
#pragma mark Setup
- (void)setupQueue {
if (queue)
return;
[self setupFormat];
[self setupBuffers];
AudioQueueNewInput(&format, listeningCallback, self, NULL, NULL, 0, &queue);
[self setupMetering];
}
- (void)setupFormat {
#if TARGET_IPHONE_SIMULATOR
format.mSampleRate = 44100.0;
#else
UInt32 ioDataSize = sizeof(sampleRate);
AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &ioDataSize, &sampleRate);
format.mSampleRate = sampleRate;
#endif
format.mFormatID = kAudioFormatLinearPCM;
format.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
format.mFramesPerPacket = format.mChannelsPerFrame = 1;
format.mBitsPerChannel = 16;
format.mBytesPerPacket = format.mBytesPerFrame = 2;
}
- (void)setupBuffers {
AudioQueueBufferRef buffers[3];
for (NSInteger i = 0; i < 3; ++i) {
AudioQueueAllocateBuffer(queue, 735, &buffers[i]);
AudioQueueEnqueueBuffer(queue, buffers[i], 0, NULL);
}
}
- (void)setupMetering {
levels = (AudioQueueLevelMeterState *)calloc(sizeof(AudioQueueLevelMeterState), format.mChannelsPerFrame);
UInt32 trueValue = true;
AudioQueueSetProperty(queue, kAudioQueueProperty_EnableLevelMetering, &trueValue, sizeof(UInt32));
}
#pragma mark -
#pragma mark Singleton Pattern
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (sharedListener == nil) {
sharedListener = [super allocWithZone:zone];
return sharedListener;
}
}
return nil;
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)init {
if ([super init] == nil)
return nil;
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX;
}
- (void)release {
// Do nothing.
}
- (id)autorelease {
return self;
}
@end
使用方法
-(void)beginListen
{//開始偵測
[[SCListener sharedListener] listen];
//取得最大音量
[[SCListener sharedListener] peakPower];
//取得平均音量
[[SCListener sharedListener] averagePower];
listener = [SCListener sharedListener];
//暂停
// We can temporarily stop returning levels
[listener pause];
[listener listen]; // Quick.
//停止
// Or free up resources when we're not listening for awhile.
[listener stop];
[listener listen]; // Slower.
}
-(void)getPower
{
AudioQueueLevelMeterState *levels = [listener levels];
NSLog(@"levels[0].mPeakPower %@", [NSString stringWithFormat:@"%f", levels[0].mPeakPower]);
//最大音量
Float32 peak = levels[0].mPeakPower;
Float32 average = levels[0].mAveragePower;
//平均音量
if (![listener isListening])
return;
NSLog(@"peak %f", peak);
}