Apportable & CoreMotion

Я пытаюсь заставить мою игру работать на 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 с Apportable?

Изменить: вот простой тестовый проект, который я создал, чтобы продемонстрировать проблему.

2 ответа

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

В частности, для такого рода движений устройств у нас был довольно многоуровневый ряд проблем, которые я (надеюсь) решил с помощью следующего обновления SDK. Я реализовал рыскание, тангаж и крен, и они, кажется, дают относительно нормальные значения. Если у вас все еще есть проблемы, напишите sdk(@)apportable.com (очевидно, удалите символы) и сообщите мне.

Другие вопросы по тегам