从加速度计执行操作

时间:2013-08-10 02:24:11

标签: ios audio accelerometer

我对Xcode中的编程非常陌生并且已经遇到了问题。 我想要做的是在检测到足够的加速度时发出声音。 有人可以告诉我我做错了什么吗? (我怀疑它的一切)。

CODE:

#import "LZDViewController.h"

@interface LZDViewController ()

@end

@implementation LZDViewController

- (void)viewDidLoad;{

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
CMAccelerometerData *accelerometerData = self.motionManager.accelerometerData;
if (fabsf(accelerometerData.acceleration.x) > 1.2
    || fabsf(accelerometerData.acceleration.y) > 1.2
    || fabsf(accelerometerData.acceleration.z) > 1.2)
{
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audio.wav", [[NSBundle mainBundle] resourcePath]]];
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    audioPlayer.numberOfLoops = 0;



    [audioPlayer play];


}
}

@end

编辑: 这是我的.h

的代码
#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
#import <AVFoundation/AVFoundation.h>
@interface LZDViewController : UIViewController
//{AVAudioPlayer *audioPlayer;}

@property (strong, nonatomic) CMMotionManager *motionManager;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;




@end

我仍然没有任何快乐,我为握手道歉。 我得到的只是一个白色的屏幕,但声音文件永远不会播放。我已经导入了正确的框架,只需一个按钮即可播放声音,但我真的想玩加速度计。 感谢

1 个答案:

答案 0 :(得分:1)

好的,您要做的第一件事是在您的接口文件中或在实现文件顶部的接口扩展中定义两个属性。这些将是动作管理器和音频播放器。

@property (strong, nonatomic) CMMotionManager *motionManager;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

然后我们可以在viewDidLoad中完成其他所有操作。下面的代码为运动管理器设置一个新的操作队列,以接收加速度计事件,初始化音频播放器和运动管理器,然后以每秒30次的间隔开始获取加速度计更新。

最后,在加速度计更新块中,只需使用您已构建的相同逻辑来检查加速度数据,如果它符合您的要求,则继续下一个条件。

**我已将此示例配置为如果播放器已播放

则不再开始播放声音
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSOperationQueue *motionQueue = [NSOperationQueue new];

    NSURL *url = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"audioFile" ofType:@"m4a"]];
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [self.audioPlayer prepareToPlay];

    self.motionManager = [CMMotionManager new];
    [self.motionManager setAccelerometerUpdateInterval:1.0f/30.0f];

    [self.motionManager startAccelerometerUpdatesToQueue:motionQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        if (fabsf(accelerometerData.acceleration.x) > 1.8 || fabsf(accelerometerData.acceleration.y) > 1.8 || fabsf(accelerometerData.acceleration.z) > 1.8) {
            NSLog(@"%@",accelerometerData);
            if (self.audioPlayer) {
                if (!self.audioPlayer.isPlaying) {
                    [self.audioPlayer play];
                }
            }
        }
    }];
}