我正在尝试使我的游戏在Android上工作。我已经使用了免费版本的Apportable移植它,并且效果很好,但是我无法实现陀螺仪功能。
CMMotionManager
被初始化,但运动更新永远不会启动(或至少handleDeviceMotion:
从未被调用)。运动经理的isAccelerometerActive
属性始终否,但是isAccelerometerAvailable
是是。
使用[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上测试该应用。
我需要做一些特殊的事情才能使用coremotion与Coportable使用?
编辑:这是我为演示问题而创建的简单测试项目。
coremotion应配合使用。这是我在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:
处理运动事件,而是尝试在handleDeviceMotion
方法中明确访问deviceMotion
属性,该方法将由重复计时器调用。
-(void) handleDeviceMotion {
CMDeviceMotion *motion = [self.motionManager deviceMotion];
// use motion data accordingly
}
并且完成后不要忘记停止更新!
[self.motionManager stopDeviceMotionUpdates];
对于这种设备运动,我们有一系列相当分层的问题,我(希望)在下一个SDK更新中解决了这些问题。我已经实施了偏航,俯仰和滚动,它们似乎给出了相对理智的值。如果您还在遇到问题,请通过电子邮件发送SDK(@)Apportable.com(显然删除Parens)并提及我。