4

ユーザーがiPhoneを顔に上げたときに通知を受け取りたい。siriのように。出来ますか?

より具体的な要件を追加: ユーザーが電話を耳に近づけたときに画面を暗くしたい。これを実装するために近接センサーを有効にできることは知っています。ただし、ユーザーがセンサー上で指を動かすと、画面が時々暗くなるのは面倒です。では、このケースを回避し、ユーザーが iPhone を上げて話すときにのみ画面を暗くする方法を知りたいですか?

4

2 に答える 2

7

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しきい値が意味をなすかどうかは少し主観的です。また、電話がほぼ垂直に保持されているかどうかを確認するだけでなく、他の加速度計データを確認することもできます(たとえば、オブジェクトが持ち上げられたかどうか)。猫の皮を剥ぐ方法はたくさんあるようです。

于 2013-03-19T02:24:40.647 に答える