2014-11-26 16 views
12

Ich möchte den Näherungssensor abfangen, ohne das Display auszuschalten.Lassen Sie die Anzeige eingeschaltet, wenn der Näherungssensor abgedeckt ist.

Ich weiß von der Dokumentation, die ich zwei Bool Variablen:

proximityMonitoringEnabled 
proximityState 

und diesen Code

[UIDevice currentDevice].proximityMonitoringEnabled = YES; 

Wenn der Näherungssensor etwas erkennt er die Anzeige erlischt, gleiche, wie es funktioniert, wenn Sie halten das Telefon an Ihr Ohr, wenn Sie telefonieren.

Wie halte ich das Display an, wenn der Näherungssensor abgedeckt ist?

+0

Hallo, danke für die Antwort.Ok, mit deinem Code kann ich den Zustand des Näherungssensors kennen, aber wenn der Zustand "JA" ist, ist die Anzeige immer noch nicht sichtbar? –

+0

aktualisiert meine Antwort –

Antwort

7

Apples Dokumentation stellt fest, dass „nicht alle iPhone OS-Geräte Näherungssensoren haben.“ Um festzustellen, ob das Gerät Ihre Anwendung läuft Nähe Überwachung unterstützt, stellen Sie die proximityMonitoringEnabled Eigenschaft auf JA, dann seinen Wert überprüfen:

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); 
} 

Quelle: http://www.whatsoniphone.com/blog/new-in-iphone-30-tutorial-series-part-4-proximity-detection/

Wird helfen, den aktuellen Zustand des Sensors zu erkennen.

Öffentliche API, die Bildschirmabdunkelung erlaubt:

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

Gefunden hier: Change to wantsSoftwareDimming in iOS 6?

+0

danke, ich werde Sie wissen lassen, ob es so schnell wie möglich funktioniert! –

+1

Hallo, ich kann jetzt nur antworten. Ich kann etwas tun, wenn der Sensor bedeckt ist, aber das Display immer noch aus! –

+0

@SimonePistecchia Warum aktualisieren Sie Ihre Frage nicht mit dem, was Sie versucht haben, damit wir Ihnen weiter helfen können. – Unheilig

7

Nach der Lektüre verschiedene Foren zum Thema, seine Zeit nicht möglich, für uns in der Öffentlichkeit api den iPhone-Bildschirm zu verhindern, wird schwarz, wenn der Näherungssensor abgedeckt ist. Das einzige, was Sie mit dem Sensor tun können, ist zu sagen, ob er durch die Benachrichtigungszentrale abgedeckt ist oder nicht, aber Sie können sein natürliches Verhalten nicht mehr kontrollieren (wenn er den Bildschirm verdunkelt/schwarz macht).

0

Verwenden Sie die folgende API, um den Näherungssensor zu aktivieren/deaktivieren.

[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 

Nicht alle iOS-Geräte verfügen über Näherungssensoren. Um festzustellen, ob die Überwachung der Entfernung verfügbar ist, versuchen Sie, sie zu aktivieren. Wenn der Wert der proximityMonitoringEnabled-Eigenschaft NO bleibt, ist die Näherungsüberwachung nicht verfügbar.

+0

Ich habe es mit iPhone 6 mit iOS 9.2.1 getestet. –

3

Zwar gibt es keine öffentliche API ist, dies zu tun, können Sie in IOKit ‚s IOHIDEventSystem Haken und für Bildschirm dimmen Benachrichtigungen hören:

// 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); 

Ihre Event-Handler-Funktion Zeiger wird wie folgt aussehen:

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); 
    } 
} 

Der Aufruf _SBDimScreen ist möglicherweise nicht einmal erforderlich, da ein leerer Funktionszeiger alle Näherungssensorereignisse stoppen kann.

Code geändert von der Befehlszeile Werkzeugbeispiel auf der AppleProxShim Seite auf dem iPhoneDevWiki.

+0

Vielen Dank für die tolle Antwort! Hoffentlich wird es möglich sein, ohne 'IOKit' zu benutzen. –

+0

Danke @DanielStorm, viel Glück! Wird aktualisiert, wenn dies jemals mit einer öffentlichen API angezeigt wird. – JAL

0

fo schnellen/iOS 10/Xcode 8,2

UIDevice.current.isProximityMonitoringEnabled = true/false..