7

Problem, który napotykam, polega na tym, że gdy użytkownik robi zdjęcie za pomocą naszej aplikacji, używając AVCaptureSession, nie mam możliwości określenia czy zrobiono zdjęcie w trybie portretu czy krajobrazu. Nasza aplikacja obsługuje tylko portret i trzymam blokadę orientacji podczas korzystania z mojego telefonu, więc staram się stworzyć rozwiązanie, zakładając, że inni mogą zrobić to samo.Jak wykryć orientację urządzenia, gdy blokada orientacji jest włączona, a aplikacja obsługuje tylko portret?

Przyjrzałem się użyciu [UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications], ale gdy blokada orientacji jest włączona, żadne powiadomienia nie są odbierane. Wiem, że ta funkcja jest możliwa, ponieważ podstawowa aplikacja Aparat i kamera w aplikacji Google Hangouts może wykryć obrót (animacje na przyciskach Anuluj i Flash są widoczne), gdy mój telefon ma włączoną blokadę orientacji.

Czy najlepiej jest użyć akcelerometru i wykryć kąt obrotu telefonu? Stara odpowiedź, Detect iPhone screen orientation, sprawia, że ​​oczywiste jest, że wykrycie kąta w ten sposób jest łatwe do zrobienia (oczywiście dostosowanie odpowiedzi do wykorzystania Core Motion zamiast UIAccelerometer), ale jestem ciekawy, czy jest inny sposób, aby to zrobić.

Odpowiedz

1

Tak, możesz to zrobić, patrząc na metadane obrazu. Nie mam czasu, aby napisać szczegółową odpowiedź (przykro mi z tego powodu), ale zrobiłem to dla mojego własnego projektu przez jakiś czas przez CMCopyDictionaryOfAttachments(NULL, buffer, kCMAttachmentMode_ShouldPropagate); gdzie przekazałem CMSampleBufferRef dla bufora. Mam ten bufor z

captureStillImageAsynchronouslyFromConnection:stillImageConnection completionHandler: ^(CMSampleBufferRef imageDataSampleBuffer, NSError *error){},

ale można je dostać od

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection również.

Możesz znaleźć wszystkie klucze do tego słownika here.

Wykonałem szybki test z domyślną aplikacją aparatu z włączoną blokadą orientacji i otrzymałem inną orientację dla dwóch zdjęć. 6 dla portretu pierwszego i 3 dla krajobrazu.

Jeszcze raz, chciałbym podać więcej szczegółów na ten temat, ale jestem pewien, że możesz to zrozumieć przeglądając dokumenty.

+1

Dzięki za informacje o CMCopyDictionaryOfAttachments, odczytanie metadanych jest o wiele łatwiejsze. Używając 'captureStillImageAsynchronouslyFromConnection', mogę uzyskać orientację = 6. Włączam tryby Landscape w aplikacji, ale bez skutku. Zamierzam wypróbować to w nowej aplikacji, aby upewnić się, że nie ma w tym ukrytego dziwnego ustawienia, które powoduje ten problem. – TheJer

+1

Zakładając, że masz połączenie "AVCaptureConnection *", czy konfigurujesz connection.videoOrientation w dowolnym miejscu? Bez względu na to, co próbuję, metadane zwraca wartość 6 dla orientacji, która ma sens, ponieważ domyślną wartością wideoOrientation jest "AVCaptureVideoOrientationPortrait". Prowadzi mnie to do pierwotnego pytania, w jaki sposób wykryć obrót, aby zmienić orientację przechwytywania. – TheJer

+0

Tak, myślę, że pamiętam, że miałem też z tym problemy. Nie mam teraz czasu, by zagłębić się w to głębiej, niestety. Ale powinno być to możliwe, ponieważ domyślna aplikacja kamery to robi i nie sądzę, żeby mieli problemy z używaniem własnego prywatnego API właśnie do tego. – vegather