Pro iOS 5 Augmented Reality-Chapter2_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Pro iOS 5 Augmented Reality-Chapter2

Pro iOS 5 Augmented Reality-Chapter2

 2013/11/2 12:19:03  CoCrash  博客园  我要评论(0)
  • 摘要:HardwareComparison硬件比较提要:本章主要涉及对iOS设备各个组件的基本体验,检测硬件组件的可用性,若要了解更多关于组件的高级用法,Google或者期待后续章节!也欢迎大家关注本章的基础内容。乏味的第一章,而且我也没有将Xcode连接到Github上面。当然,这个可能是因为网络限制的原因,公司对网络要监控和限制的。因为现实增强对硬件的一般要求有:很明显,少不了摄像头!而大部分的增强现实案例都需要确定位置,方向,所以GPS和指南针将非常有用。声音输入/输出,所以需要麦克风和扬声器
  • 标签:iOS

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上,请见谅。

欢迎大家对本章的内容进行评论,或在评论中,和大家分享你所看到了解到的技术。谢谢!

发表评论
用户名: 匿名