有没有什么办法来监控像iPhone的用户的运动“筹集说话”功能?(Is there any way

2019-08-17 17:25发布

我想在用户将iphone的脸色得到通知。 就像Siri的一样。 可能吗?

添加更多具体的要求:我想变黑画面时用户将手机靠近他的耳朵。 我所知道的接近传感器可以使实现这一点。 但是,这很烦人,屏幕会不时当用户在传感器移动手指就变黑了时间。 所以,我不知道如何避免这种情况下,仅调暗画面时用户提高iphone说话?

Answer 1:

请参阅使用接近传感器中的UIDevice类参考。 那么你:

  • 启用它:

     UIDevice *device = [UIDevice currentDevice]; device.proximityMonitoringEnabled = YES; 
  • 检查是否成功启用; 观察UIDeviceProximityStateDidChangeNotification如果成功通知; 如果不是,您的设备可能不能够:

     if (device.proximityMonitoringEnabled) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleProximityChange:) name:UIDeviceProximityStateDidChangeNotification object:nil]; } else { // device not capable } 
  • 写你的选择:

     - (void)handleProximityChange:(NSNotification *)notification { NSLog(@"%s proximityState=%d", __FUNCTION__, [[UIDevice currentDevice] proximityState]); } 

为了检测用户是否把它举在他们的脸上,我会嫁的接近传感器CMMotionManager ,并期待在gravity属性,看看他们拿着手机几乎垂直。 因此,定义一些类属性:

@property (nonatomic, strong) CMMotionManager *motionManager;
@property (nonatomic, strong) NSOperationQueue *deviceQueue;

然后你就可以开始CMMotionManager ,寻找设备是否处于垂直位置上:

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)
{
    BOOL vertical = (motion.gravity.z > -0.4 && motion.gravity.z < 0.4 & motion.gravity.y < -0.7);
    if ((vertical && !device.proximityMonitoringEnabled) || (!vertical && device.proximityMonitoringEnabled))
    {
        device.proximityMonitoringEnabled = vertical;
    }
}];

无论这些gravity阈值的意义是有点主观的。 你也可以,而不只是想看看,如果手机被保持大致垂直,看看其他的加速度计数据(例如没有他们提出的目标或没有)。 好像有很多方法对皮肤的猫。



Answer 2:

我知道这是老了,但我简化了逻辑位和斯威夫特取得的包装类。

你可以在这里找到它

class DeviceRaisedToEarListener: NSObject {
private let deviceQueue = NSOperationQueue()
private let motionManager = CMMotionManager()
private var vertical: Bool = false

private(set) var isRaisedToEar: Bool = false {
    didSet {
        if oldValue != self.isRaisedToEar {
            self.stateChanged?(isRaisedToEar: self.isRaisedToEar)
        }
    }
}

var stateChanged:((isRaisedToEar: Bool)->())? = nil

override init() {
    super.init()
    self.setupMotionManager()
}

private func setupMotionManager() {
    self.motionManager.deviceMotionUpdateInterval = 5.0 / 60.0
    let device = UIDevice.currentDevice()

    // Only listen for proximity changes if the device is held vertically
    self.motionManager.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrame.XArbitraryZVertical, toQueue: self.deviceQueue) { (motion, error) in
        self.vertical = (motion.gravity.z > -0.4 && motion.gravity.z < 0.4 && motion.gravity.y < -0.7)
    }
}

func startListening() {
    UIDevice.currentDevice().proximityMonitoringEnabled = true
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleProximityChange:", name: UIDeviceProximityStateDidChangeNotification, object: nil)
}

func stopListening() {
    UIDevice.currentDevice().proximityMonitoringEnabled = false
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

func handleProximityChange(notification: NSNotification) {
    self.isRaisedToEar = UIDevice.currentDevice().proximityState && self.vertical
}

deinit {
    self.stopListening()
}
}


// How to use:
private func setupRaiseListener() {
    self.deviceListener.stateChanged = { [weak self] isRaisedToEar in
      println("is raised? \(isRaisedToEar)")
    }
    self.deviceListener.startListening()
}


文章来源: Is there any way to monitor user's movement of iphone like the “raise to speak” feature?