2014-01-21 25 views
2

我想創建一個應用程序,可以接收和處理動作更新,以瞭解用戶是靜止的,行走的,跑步的還是在交通工具上。 我在參考資料中看到CMMotionActivityManager對我很有用。如何使用CMMotionActivityManager並接收更新?

CMMotionActivityManager類提供對設備存儲的運動數據的訪問。運動數據反映了用戶是在步行,跑步,在車輛中還是在一段時間內靜止。

我是新來的應用程序開發,我不明白如何使用該方法開始更新。 這樣做的方法是- (void)startActivityUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMMotionActivityHandler)handler。 我不明白我應該在處理程序中,因爲基準說:

處理 塊檢測到當前的運動類型發生變化時執行。有關此塊參數的信息,請參閱CMMotionActivityHandler。該屬性不能爲零。

我的實現是:

- (IBAction)startButtonPressed:(id)sender { 
_motionActivityManager = [[CMMotionActivityManager alloc] init]; 
[_motionActivityManager startActivityUpdatesToQueue:NSOperationQueueDefaultMaxConcurrentOperationCount withHandler:CMMotionActivityHandler]; 
} 

我已經導入了CoreMotion框架 不過的XCode不承認CMMotionActivityHandler,我在哪裏錯了?我該如何解決這個問題?

感謝

回答

-2
-(void)device_motion{ 

    self.motionManager= [[CMMotionManager alloc] init]; 
    self.motionManager.deviceMotionUpdateInterval = 1.0/60.0; 
    self.opQ = [NSOperationQueue currentQueue]; 

    if(self.motionManager.isDeviceMotionAvailable) 
    { 

     // Listen to events from the motionManager 
     self.motionHandler =^(CMDeviceMotion *motion, NSError *error) 
     { 
      if (!prevTime) 
      { 
       prevTime = motion.timestamp; 
       return; 
      } 

      //Calculate delta time between previous motionUpdate call and _now_ 
      double deltaTime = motion.timestamp - prevTime; 
      prevTime = motion.timestamp; 

      //Y axis rotation 
      CMRotationRate rotationRate = motion.rotationRate; 
      double rotation = rotationRate.y; 

      if (fabs(rotation) < 0.05) //igonre bias 
       return; 

      //Calculate the angular distance 
      double anglePathRad = rotation * deltaTime; 

      //calculate total panoram angle 
      currAngle += CC_RADIANS_TO_DEGREES(anglePathRad); 

      NSLog(@"Angle : %f ",currAngle); 


     }; 

    } else { 
     NSLog(@"No Device Motion on device."); 
    } 

    // Start listening to motionManager events 
    [self.motionManager startDeviceMotionUpdatesToQueue:self.opQ withHandler:self.motionHandler]; 


} 
+0

你能不能解釋一下這段代碼?我不明白。 motionHandler中的代碼是什麼? – emattiazzi

+1

這是CMMotionManager而不是CMMotionActivityManager –

+0

NSLog不需要在主隊列上執行,這是多餘的。 –

4

示例代碼:

[_motionActivityManager startActivityUpdatesToQueue:[[NSOperationQueue alloc] init] 
              withHandler: 
    ^(CMMotionActivity *activity) { 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      if ([activity walking]) { 
       NSLog(@"walking"); 
      } 
    }); 
}]; 
+0

我應該在上面的代碼中定義其他的東西嗎?我已經使用你的代碼,並添加了一些如果活動,以檢查它是汽車,運行,未知,但它不起作用。 – emattiazzi

+1

也許它不適用於模擬器? – emattiazzi

+0

@mattyahtzee:當然它不會在模擬器上工作。你必須檢查設備。 – Bhavin

0

//檢查availasble設備上

BOOL b= [CMMotionActivityManager isActivityAvailable];; 

motionActivityManager=[[CMMotionActivityManager alloc]init]; 
//register for coremotion notification 

[motionActivityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMotionActivity *activity) { 

    NSLog(@"Got a core motion update"); 
    NSLog(@"Current activity date is %f",activity.timestamp); 
    NSLog(@"Current activity confidence from a scale of 0 to 2 - 2 being best- is: %ld",activity.confidence); 
    NSLog(@"Current activity type is unknown: %i",activity.unknown); 
    NSLog(@"Current activity type is stationary: %i",activity.stationary); 
    NSLog(@"Current activity type is walking: %i",activity.walking); 
    NSLog(@"Current activity type is running: %i",activity.running); 
    NSLog(@"Current activity type is cycling: %i",activity.cycling); 
    NSLog(@"Current activity type is automotive: %i",activity.automotive); 



}]; 

請查看設備

4

這個答案的最高投票版本有點迂迴。它創建一個隊列,然後使用GCD在主隊列上執行。此外,許多示例都在withHandler參數中放置了一個塊,但我發現它笨重並且看起來不夠乾淨(從代碼格式的角度來看)。

這裏是我的示例實現:

@implementation MotionHandler { 
@private 
    // this is a private variable for this class that is not visible outside 
    // (also, iOS handles memory and access management of these faster than properties) 
    CMMotionActivityManager *_motionActivityManager; 
} 

// initialization method, you can do other stuff here too 
- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     // check to see if the device can handle motion activity 
     if ([CMMotionActivityManager isActivityAvailable]) { 
      // if so, initialize the activity manager 
      _motionActivityManager = [[CMMotionActivityManager alloc] init]; 
     } 
    } 
} 

- (void)startMotionActivityMonitoring { 
    // create the motion activity handler 
    CMMotionActivityHandler motionActivityHandler = ^(CMMotionActivity *activity) { 
     // TODO motion detected here. Do something. 
    } 

    // check to see if the motion activity manager exists 
    if (_motionActivityManager) { 
     // if so, start monitoring activity 
     // notice that we add updates to the mainQueue. This will call your handler on the main thread 
     [_motionActivityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:motionActivityHandler]; 
    } 
} 

@end 
1

雨燕2.0

_motionActivityManager = CMMotionActivityManager() 
_motionActivityManager.startActivityUpdatesToQueue(NSOperationQueue.mainQueue()) 
{ 
    // CMMotionActivity 
    activity in 

    // do your logic here 

} 
相關問題