【问题标题】:Apportable & CoreMotion适宜和核心运动
【发布时间】:2014-01-31 14:40:51
【问题描述】:

我正在尝试让我的游戏在 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 上测试该应用。

要使用 CoreMotion 和 Apportable,我需要做些什么特别的事情吗?

编辑: Here's 我创建的一个简单的测试项目来演示这个问题。

【问题讨论】:

  • logcat 可能与 CoreMotion 问题无关。你能简化 CoreMotion 初始化吗?
  • @PaulBeusterien 我不确定您所说的简化是什么意思,但我添加了一些有关该问题的信息。

标签: android gyroscope core-motion apportable iio


【解决方案1】:

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];

【讨论】:

  • 抱歉花了这么长时间才回复这个问题。刚刚在 3 台 Android 设备上进行了测试,但都无法在其中任何一台上运行。我想知道是否应该在 Apportable 配置的“deps”部分中包含 CoreMotion?如果我将它添加到 Xcode 中的链接框架,它会自动包含吗?
  • 如果您使用的是 SDK,它应该会被自动拾取。如果不是,它不太可能编译。您使用的是什么设备,您能否创建一个简化的测试用例来展示您遇到的问题?
  • @iosdev 说到 Apportable 配置,您必须确保在配置文件的 FEATURES 数组中列出了“accelerometer”。如果未列出,您将无法访问物理运动硬件本身。
  • @mike_haney 我正在大约 10 台设备上测试该应用程序,包括平板电脑和手机(例如三星 Galaxy S2 和华硕 Nexus 7)。 Here's 我创建的完整测试项目。
  • @hifigi 我有它,并且 UIAccelerometer 正在工作,这不应该是问题......我猜。但我确定这很简单,只是我还没有注意到 :)
【解决方案2】:

特别是对于这种设备运动,我们遇到了一系列相当分层的问题,我(希望)在下一次 SDK 更新中解决了这些问题。我已经实现了偏航、俯仰和滚动,它们似乎给出了相对合理的值。如果您仍有问题,请发送电子邮件至 sdk(@)apportable.com(显然删除括号)并提及我。

【讨论】:

  • 谢谢,我会尽快看看。
  • 确保等待下一个 SDK 版本,可能会在几天后发布。
  • 是的,我有点误解了你帖子的那一部分:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多