Hardware Comparison
硬件比较
提要:本章主要涉及对iOS设备各个组件的基本体验,检测硬件组件的可用性,若要了解更多关于组件的高级用法,Google或者期待后续章节!也欢迎大家关注本章的基础内容。
乏味的第一章,而且我也没有将Xcode连接到Github上面。当然,这个可能是因为网络限制的原因,公司对网络要监控和限制的。
因为现实增强对硬件的一般要求有:很明显,少不了摄像头!而大部分的增强现实案例都需要确定位置,方向,所以GPS和指南针将非常有用。声音输入/输出,所以需要麦克风和扬声器。更多时候,希望加入些游戏的元素,则少不了硬件加速计和一个图形工具包。
进入第二章,会简单为大家展示苹果iPhone和iPad设备的兼容性问题,苹果设备所包括的硬件组件。这本书提及到的设备包含到了iPhone 3GS,所以有些硬件组件是没有的,比如前置摄像头录像能力。然后,市场上普及的苹果设备,iPhone3GS的占有率应很低了吧。个人认为基本不用考虑了。
2.1 除旧存新
2.2 硬件组件
2.2.1 摄像头支持
2.2.2 位置检测能力
2.2.3 数字指南针
2.2.4 声音支持
2.2.5 检查录像功能
2.2.6 加速计和陀螺仪
2.3 强制硬件需求
2.4 总结
我们先看看本章的示例代码运行截图吧
从上面可看出,我们将对设备的各个硬件组件的可用能力进行检查。
2.2.1 摄像头支持
利用手机的摄像能力,有两种方法可以用来创建增强现实的应用
一、利用视频捕获来检查元素,识别物体等
二、使用视频采集作为应用程序的背景,同时完全地忽略内容。
监测摄像头
通过UIImagePickerController类,我们可以编程检查设备上的摄像头(后置和前置摄像头)是否可用。isSourceTypeAvailable方法可以判断我们想要使用的摄像头类型在当前设备上是否可用。
1 /** 2 有没有摄像头 3 */ 4 - (IBAction)checkCamera:(id)sender { 5 BOOL cameraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 6 [self showAlertView:@"Camera" available:cameraAvailable]; 7 8 } 9 10 /** 11 有没有前置摄像头 12 */ 13 - (IBAction)checkFrontCamera:(id)sender { 14 15 BOOL frontCameraAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]; 16 [self showAlertView:@"Front Camera" available:frontCameraAvailable]; 17 } 18 19 /** 20 辅助方法,弹出提示框,本章示例代码都会用到 21 */ 22 - (void)showAlertView:(NSString *)title available:(BOOL)available 23 { 24 UIAlertView * alert = [[UIAlertView alloc] initWithTitle:title message:@"" delegate:self cancelButtonTitle:@"OK, I Know" otherButtonTitles:nil, nil]; 25 if (available) { 26 [alert setMessage:@"Available"]; 27 }else{ 28 [alert setMessage:@"Unavailable"]; 29 } 30 [alert show]; 31 }
2.2.2 位置检测能力
iOS为与设备上的位置服务和硬件做交互提供了Core Location Framework。遗憾的是,Core Location Framework没有提供任何对GPS存在性的检测。所以需要在应用中强制硬件需求(2.3)。
检测位置服务是否已启动。
对APP存在位置服务不可用的情况:
由于上述原因,应用在试图使用位置服务之前总是调用CLLocationManager的locationServicesEnabled类方法。
1 /** 2 定位能力检查 3 */ 4 - (IBAction)checkLocation:(id)sender { 5 BOOL locateEnable = [CLLocationManager locationServicesEnabled]; 6 [self showAlertView:@"Location" available:locateEnable]; 7 }
有两种确定用户位置的方法可用:
一、标准位置服务(Standard Location Service)是一个可以设置的,通用的,支持所有iOS版本的解决方案。
二、显著变更位置服务(Significant-Change Location Service)使用蜂窝无线技术为设备提供一个低功率的位置服务。只有在iOS4.0及以上版本可用,能唤起暂停或者没有运行的App。
2.2.3 数字指南针
在增强现实应用中,导向能力有益于应用的良好体验。对任何基于位置的增强现实应用,都需要确定用户正面向哪一个方向。本节会简单指引去检测数字指南针的存在。
首先,需要去导入核心位置框架(Core Location Framework),至于不知道如何去导入一个系统框架(framework),可以Google了···其次,添加头文件#import<CoreLocation/CoreLocation.h>。最后,在本章Demo中,我们通过headingAvailable类方法去检测数字指南针的可用性。
然而,指南针和摄像头一样,都不知模拟器支持的硬件组件。要想体会到iOS的魅力,还是建议大家入手一部iOS设备,现在的4,4S也接近白菜价了吧···虽然博主是买不起的屌丝···
1 /** 2 数字指南针 3 */ 4 - (IBAction)checkMagnetometer:(id)sender { 5 BOOL magenetometerAvailable = [CLLocationManager headingAvailable]; 6 [self showAlertView:@"Magnetometer" available:magenetometerAvailable]; 7 }
更多关于数字指南针的高级用法,关注后续章节。
2.2.4 声音支持
对于硬件组件的能力检测,方法大同小异,只是在链接系统框架的时候会有区别。对于音频能力的检测,需要使用AVFoundation Framework。添加合适的import头文件,#import<AVFoundation/AVFoundation.h>。从代码中可知,我们会获取到AVAudioSession的单例对象audioSession,调用单例对象的inputIsAvailable属性即可。
1 /** 2 声音支持 3 */ 4 - (IBAction)checkAudio:(id)sender { 5 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 6 BOOL audioAvailable = audioSession.inputAvailable; 7 [self showAlertView:@"Audio" available:audioAvailable]; 8 }
2.2.5 检查录像功能
有一个可用的摄像头,并不意味着一定能够录像,所以我们也要去检测摄像头的录像能力。
这里,我们需要引入另一个新的框架,Mobile Core Service Framework,翻译过来 移动核心服务框架 ,这里会导入需要的头文件#import<MobileCoreServices/UTCoreTypes.h>.
在示例代码中,我们声明了一个辅助方法 – (BOOL) isVideoCameraAvailable 来检测录像能力。
1 /** 2 录像能力辅助方法 3 */ 4 - (BOOL)isVideoCameraAvailable 5 { 6 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 7 NSArray *sourceTypes = [UIImagePickerController availableMediaTypesForSourceType:picker.sourceType]; 8 if (![sourceTypes containsObject:(NSString*)kUTTypeMovie]) { 9 return NO; 10 } 11 return YES; 12 }
在辅助方法代码块中,我们简单的检查所有可用媒体资源类型,然后检测返回的数组,看里面是否包含一个值为kUTTypeMovie的NSString类型的对象。如果找到这个值,那么表明这个摄像头设备支持录像。
1 /** 2 检查录像能力 3 */ 4 - (IBAction)checkVIdeo:(id)sender { 5 [self showAlertView:@"Video" available:[self isVideoCameraAvailable]]; 6 }
模拟器不支持录像,没错,连摄像头都不支持,靠啥录像呢?!
2.2.6 加速计和陀螺仪
在大部分的增强现实应用案例中,用户的移动设备会改变方向,或者来回移动。为了响应用户的动作,我们需要处理从加速计和陀螺仪返回的数据。陀螺仪负责测量和跟踪方向,加速计负责监测震动。
加速计通过测量3个轴来度量一个相对于地球表面静止的平台的方向。如果设备只朝一个特定的方向加速,那么这个加速就无法与地球万有引力导致的加速相区分。所以这个测量的唯一问题是:它没有为检测某个特定的方向提供足够的信息。
iPhone4开始引入三轴陀螺仪,由于它有测量围绕一个轴的旋转率的能力,所以它弥补了加速计的不足。陀螺仪能够测量围绕一个旋转轴的连续状态,并能够在旋转停止或变化的时候通知APP。
检测陀螺仪的存在性需要引入另一个框架Core Motion Framework(核心动作框架)。#import<CoreMotion/CoreMotion.h>
同样,我们会声明一个辅助实例方法 –(BOOL)isGyroscopeAvailable 来帮助我们检查陀螺仪的可用性。
1 /** 2 陀螺仪辅助方法 3 */ 4 - (BOOL)isGycroscopeAvailable 5 { 6 #ifdef __IPHONE_4_0 7 CMMotionManager *motionManager = [[CMMotionManager alloc] init]; 8 BOOL gycroscope = motionManager.gyroAvailable; 9 return gycroscope; 10 #else 11 return NO; 12 #endif 13 }
我们使用了CoreMotionManager类的gyroAvailable属性来检查陀螺仪的存在。代码里,我们特定检查对_IPHONE_4_0宏的检查语句。因为在4.0之前是没有陀螺仪硬件组件的。
1 /** 2 检查陀螺仪 3 */ 4 - (IBAction)checkGyroscope:(id)sender { 5 [self showAlertView:@"Gycroscope" available:[self isGycroscopeAvailable]]; 6 }
当然,陀螺仪在模拟器中也是无法使用的。
本章主要是针对iOS设备各个组件的基本体验,检测各个硬件组件的可用性,知识相当简单,若要了解更多关于组件的高级用法,请移步Google或者期待后续章节!
本章示例代码下载链接:http://files.cnblogs.com/IlvDanping1024/iOS_AR_Ch2.zip暂时代码不上传到Git上,请见谅。
欢迎大家对本章的内容进行评论,或在评论中,和大家分享你所看到了解到的技术。谢谢!