适合的& CoreMotion

时间:2014-01-31 14:40:52

标签: android gyroscope core-motion apportable iio

我正试图让我的游戏在Android上运行。我已经用免费版本的Apportable移植它并且它工作得很好,但是我还没有能够实现陀螺仪功能。

CMMotionManager被初始化但运动更新永远不会开始(或者至少handleDeviceMotion:永远不会被调用)。运动管理器的isAccelerometerActive属性始终为NO,但isAccelerometerAvailable为YES。

使用[NSOperationQueue mainQueue]也无济于事。

这是我初始化动画管理器的方式:

self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.gyroUpdateInterval = .2;

[self.motionManager startDeviceMotionUpdatesToQueue:[[NSOperationQueue alloc] init]
                                                withHandler:^(CMDeviceMotion *motion, NSError *error) {
                                                    dispatch_async(dispatch_get_main_queue(), ^{
                                                        [self handleDeviceMotion:motion];
                                                    });
                                                }];

它向logcat发出以下消息:

E/Sensors (  507): HAL:ERR open file /sys/bus/iio/devices/iio:device0/dmp_event_int_on to write with error 2
E/Sensors (  507): HAL:ERR can't disable DMP event interrupt

我不知道这意味着什么...... 我正在测试Asus Nexus 7上的应用程序。

使用带有Apportable的CoreMotion需要做些什么特别的事情吗?

编辑: Here's我创建的一个简单测试项目,用于演示此问题。

2 个答案:

答案 0 :(得分:1)

CoreMotion应该与apportable一起使用。这是我在Nexus 7(2012)上测试的简化初始化和使用范例。

self.motionManager = [[CMMotionManager alloc] init];
[self.motionManager startDeviceMotionUpdates];

self.motionTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 
    target:self 
    selector:@selector(handleDeviceMotion) 
    userInfo:nil 
    repeats:YES];

不要使用startDeviceMotionUpdatesToQueue: withHandler:来处理动作事件,而是尝试显式访问deviceMotion方法中的handleDeviceMotion属性,该方法将由重复计时器调用。

-(void) handleDeviceMotion {
    CMDeviceMotion *motion = [self.motionManager deviceMotion];
    // use motion data accordingly
}    

不要忘记在完成后停止更新!

[self.motionManager stopDeviceMotionUpdates];

答案 1 :(得分:0)

特别是对于这种类型的设备动作,我们有一系列相当分层的问题,我希望通过下一次SDK更新解决这些问题。我实现了偏航,俯仰和翻滚,他们似乎给出了相对理智的价值观。如果您仍有问题,请发送电子邮件至sdk(@)apportable.com(显然删除parens)并提及我。