2015-04-02 2 views
1

Я хочу найти устройство бездействия через программу. то есть найти состояние, когда устройство не перемещено или не перемещено. Я пробовал следующие API-интерфейсы акселерометра и ядра. Но я не мог понять состояние простоя устройства из значений, которые он дает.Поиск состояния незанятого устройства iOS

Любые предложения будут оценены.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view, typically from a nib. 
    currentMaxAccelX = 0; 
    currentMaxAccelY = 0; 
    currentMaxAccelZ = 0; 

    currentMaxRotX = 0; 
    currentMaxRotY = 0; 
    currentMaxRotZ = 0; 

    value = 0; 

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

    [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] 
              withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
               [self outputAccelertionData:accelerometerData.acceleration]; 
               if(error){ 

                NSLog(@"%@", error); 
               } 
              }]; 

    [self.motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue] 
            withHandler:^(CMGyroData *gyroData, NSError *error) { 
             [self outputRotationData:gyroData.rotationRate]; 
            }]; 
} 

-(void)outputAccelertionData:(CMAcceleration)acceleration 
{ 
    self.accX.text = [NSString stringWithFormat:@"accX: %.2fg",acceleration.x]; 
    if(fabs(acceleration.x) > fabs(currentMaxAccelX)) 
    { 
     currentMaxAccelX = acceleration.x; 
    } 

    self.accY.text = [NSString stringWithFormat:@"accY: %.2fg",acceleration.y]; 
    if(fabs(acceleration.y) > fabs(currentMaxAccelY)) 
    { 
     currentMaxAccelY = acceleration.y; 
    } 

    if (fabs(acceleration.y) - fabs(value) > 0.2 || fabs(value) - fabs(acceleration.y) > 0.2) 
    { 
     NSLog(@"Not idle"); 
    } 
    value = acceleration.y; 


    self.accZ.text = [NSString stringWithFormat:@"accZ: %.2fg",acceleration.z]; 
    if(fabs(acceleration.z) > fabs(currentMaxAccelZ)) 
    { 
     currentMaxAccelZ = acceleration.z; 
    } 

    self.maxAccX.text = [NSString stringWithFormat:@"maxAccX: %.2f",currentMaxAccelX]; 
    self.maxAccY.text = [NSString stringWithFormat:@"maxAccY: %.2f",currentMaxAccelY]; 
    self.maxAccZ.text = [NSString stringWithFormat:@"maxAccZ: %.2f",currentMaxAccelZ]; 

} 

-(void)outputRotationData:(CMRotationRate)rotation 
{ 
    self.rotX.text = [NSString stringWithFormat:@"rotX: %.2fr/s",rotation.x]; 
    if(fabs(rotation.x) > fabs(currentMaxRotX)) 
    { 
     currentMaxRotX = rotation.x; 
    } 
    self.rotY.text = [NSString stringWithFormat:@"rotY: %.2fr/s",rotation.y]; 
    if(fabs(rotation.y) > fabs(currentMaxRotY)) 
    { 
     currentMaxRotY = rotation.y; 
    } 
    self.rotZ.text = [NSString stringWithFormat:@"rotZ: %.2fr/s",rotation.z]; 
    if(fabs(rotation.z) > fabs(currentMaxRotZ)) 
    { 
     currentMaxRotZ = rotation.z; 
    } 
    self.maxRotX.text = [NSString stringWithFormat:@"maxRotX: %.2f",currentMaxRotX]; 
    self.maxRotY.text = [NSString stringWithFormat:@"maxRotY: %.2f",currentMaxRotY]; 
    self.maxRotZ.text = [NSString stringWithFormat:@"maxRotZ: %.2f",currentMaxRotZ]; 
} 
+0

«Я не мог понять состояние простоя устройства из значений, которые он дает». Какие ценности он дает? – matt

+0

Можете ли вы подсказать, подходит ли то, что я пытаюсь, или нет? Можете ли вы предложить какой-то способ найти время простоя устройства на устройстве iOS? – Stella

+0

Если на холостом ходу вы имеете в виду _не перемещать _... пожалуйста, измените текст вопроса, чтобы использовать слово ** стационарное ** _ вместо пустого _.... для телефона (или вообще электронных устройств) состояние бездействия относится к отсутствующим программам (или вообще нет цифровой активности) и т. д. – lukya

ответ

0

Вы можете проверить эту ссылку CmMotionManager reference.

self.deviceQueue = [[NSOperationQueue alloc] init]; 
self.motionManager = [[CMMotionManager alloc] init]; 
self.motionManager.deviceMotionUpdateInterval = 5.0/60.0; 

// UIDevice *device = [UIDevice currentDevice]; 

[self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical 
                toQueue:self.deviceQueue 
               withHandler:^(CMDeviceMotion *motion, NSError *error) 
{ 
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    CGFloat x = motion.gravity.x; 
    CGFloat y = motion.gravity.y; 
    CGFloat z = motion.gravity.z; 
}]; 
}]; 
0

Подход с измерения ускорения является правильным, поэтому в случае, если вам удалось получить вектор ускорения, вы должны просто вычислить the norm of the vector и проверить, если значение терки, чем некоторая константа.

CGFloat norm = sqrt(acceleration.x * acceleration.x + acceleration.y * acceleration.y + acceleration.z * acceleration.z); 
NSLog(@"Norm of the vector = %f", norm); 
CGFloat minimumValueToConsiderThatDeviceIsMoving = 0.2; // obtain more accurate value experimentally 
if (norm > minimumValueToConsiderThatDeviceIsMoving) { 
    NSLog(@"Device is moving!"); 
} else { 
    NSLog(@"Device is still!"); 
} 
Смежные вопросы