2014-11-26 22 views
12

Я хочу перехватить датчик приближения, не выключая дисплей.Держать дисплей включен, когда датчик приближения закрыт.

Я знаю, что в документации, что у меня есть два Bool переменные:

proximityMonitoringEnabled 
proximityState 

и этот код

[UIDevice currentDevice].proximityMonitoringEnabled = YES; 

Когда датчик обнаруживает что-то он отключает дисплей, так же, как это делает, когда вы держите телефон на ухо, когда звоните по телефону.

Как включить отображение, когда датчик приближения закрыт?

+0

Привет, спасибо за ответ.Хорошо, с вашим кодом я могу узнать состояние датчика приближения, но если состояние «ДА», дисплей пока не отображается? –

+0

обновил мой ответ –

ответ

7

документация Apple, отмечает, что «не все устройства iPhone OS имеют датчики близости.» Для того, чтобы определить, является ли устройство ваше приложение работает поддерживает мониторинг близости, установите свойство proximityMonitoringEnabled в YES, а затем проверить его значение:

UIDevice *device = [UIDevice currentDevice]; 
[device setProximityMonitoringEnabled:YES]; 

if (device.proximityMonitoringEnabled == YES) { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(proximityChanged:) 
               name:@"UIDeviceProximityStateDidChangeNotification" 
               object:device]; 
} 

- (void) proximityChanged:(NSNotification *)notification { 
    UIDevice *device = [notification object]; 
    NSLog(@"In proximity: %i", device.proximityState); 
} 

Источник: http://www.whatsoniphone.com/blog/new-in-iphone-30-tutorial-series-part-4-proximity-detection/

Помогите определить текущее состояние датчика.

Public API, что позволяет экран тусклый:

[UIScreen mainScreen].wantsSoftwareDimming = YES; 
[UIScreen mainScreen].brightness = $your_brightness_value; 

Найдено здесь: Change to wantsSoftwareDimming in iOS 6?

+0

спасибо, я дам вам знать, если он работает как можно скорее! –

+1

привет, поэтому я могу ответить только сейчас. Я могу что-то сделать, когда сенсор закрыт, но дисплей все еще выключен! –

+0

@SimonePistecchia Почему бы вам не обновить свой вопрос тем, что вы пробовали, чтобы мы могли еще лучше помочь вам. – Unheilig

7

После чтения различных форумов по данной теме, его в настоящее время не представляется возможным для нас в общественном апи, чтобы предотвратить экран iPhone от когда черный датчик приближается. Единственное, что вы можете сделать с датчиком, это сказать, когда оно покрыто или нет через центр уведомлений, но опять же вы не можете контролировать его естественное поведение (когда он тускнеет/затушевывает экран).

0

Используйте следующий API для включения/выключения датчика приближения.

[UIDevice currentDevice].proximityMonitoringEnabled = NO; // Disables the Proximity Sensor and won't turnoff the display when sensor covered 

[UIDevice currentDevice].proximityMonitoringEnabled = YES; // Enables the Proximity Sensor and will turnoff the display when sensor covered 

Не все устройства iOS имеют датчики приближения. Чтобы определить, доступен ли мониторинг близости, попробуйте включить его. Если значение свойства proximityMonitoringEnabled остается НЕТ, мониторинг близости недоступен.

+0

Я тестировал его с iPhone 6 с iOS 9.2.1. –

3

Хотя нет никакого публичного API, чтобы сделать это, вы можете подключить в IOKit «s IOHIDEventSystem и слушать экран затемнение уведомлений:

// Create and open an event system. 
IOHIDEventSystemRef system = IOHIDEventSystemCreate(NULL); 

// Set the PrimaryUsagePage and PrimaryUsage that the AppleProxShim service uses 
int page = 65280; 
int usage = 8; 

// Create a dictionary to match the service with 
CFStringRef keys[2]; 
CFNumberRef nums[2]; 
keys[0] = CFStringCreateWithCString(0, "PrimaryUsagePage", 0); 
keys[1] = CFStringCreateWithCString(0, "PrimaryUsage", 0); 
nums[0] = CFNumberCreate(0, kCFNumberSInt32Type, &page); 
nums[1] = CFNumberCreate(0, kCFNumberSInt32Type, &usage); 
CFDictionaryRef dict = CFDictionaryCreate(0, (const void**)keys, (const void**)nums, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
// Get the total of matching services with the above criteria 
CFArrayRef srvs = (CFArrayRef)IOHIDEventSystemCopyMatchingServices(system, dict, 0, 0, 0, 0); 

// Get the service 
IOHIDServiceRef serv = (IOHIDServiceRef)CFArrayGetValueAtIndex(srvs, 0); 
int interval = 1 ; 

// Set an interval of 1 , to activate the sensor 
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &interval)); 

// add your event handler 
IOHIDEventSystemOpen(system, handle_event, NULL, NULL, NULL); 
int defaultInterval = 0; 
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &defaultInterval)); 

// close handles and release the IOHIDEventSystemRef 
IOHIDEventSystemClose(system, NULL); 
CFRelease(system); 

Ваш указатель на функцию обработчика событий будет выглядеть примерно так:

void handle_event(void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) { 
    if (IOHIDEventGetType(event) == kIOHIDEventTypeProximity) { // Proximity Event Received 
     // not necessary, but if you want the value from the sensor, get it from IOHIDEventGetIntegerValue 
     int proximityValue = IOHIDEventGetIntegerValue(event, (IOHIDEventField)kIOHIDEventFieldProximityDetectionMask); // Get the value of the ProximityChanged Field (0 or 64) 

     // Call dimScreen with the boolean NO 
     int (*SBSSpringBoardServerPort)() = (int (*)())dlsym(RTLD_DEFAULT, "SBSSpringBoardServerPort"); 
     int port = SBSSpringBoardServerPort(); 
     void (*_SBDimScreen)(int _port,BOOL shouldDim) = (void (*)(int _port,BOOL shouldDim))dlsym(RTLD_DEFAULT, "SBDimScreen"); 

     // This is where the logic to dim the screen based on the sensor value would go. In this case, I'm hardcoding NO instead of the value of proximityValue from above 
     // BOOL dim = proximityValue == 0 ? NO : YES; 
     _SBDimScreen(port, NO); 
    } 
} 

Вызов _SBDimScreen может быть даже не нужен, поскольку наличие пустого указателя функции может остановить все события датчика близости.

Код, измененный из примера инструмента командной строки на странице AppleProxShim на iPhoneDevWiki.

+0

Спасибо за такой отличный ответ! Надеюсь, это станет возможным без использования 'IOKit' в какой-то момент. –

+0

Спасибо @ DanielStorm, удачи! Будет обновляться, если это когда-либо будет открыто публичным API. – JAL

0

Ф.О. скор/IOS 10/Xcode 8,2

UIDevice.current.isProximityMonitoringEnabled = true/false.. 
Смежные вопросы