Potrzebuję sposobu sterowania lampą aparatu na urządzeniu z Androidem podczas nagrywania wideo. Robię aplikację stroboskopową, a robienie filmów z błyskającym światłem stroboskopowym umożliwiłoby rejestrowanie obiektów poruszających się z dużą prędkością, takich jak łopatki wentylatora.Włączanie lampy błyskowej podczas nagrywania wideo
Lampa błyskowa może być włączona tylko poprzez uruchomienie podglądu wideo i ustawienie FLASH_MODE_TORCH w parametrach kamery. To wyglądałoby tak:
Camera c = Camera.open();
Camera.Parameters p = c.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(p);
c.startPreview();
Po uruchomieniu podglądu mogę przełączyć ten parametr w tę iz powrotem, aby włączyć i wyłączyć światło. Działa to dobrze, dopóki nie spróbuję nagrać wideo. Problem polega na tym, że aby przekazać aparat do MediaRecorder, najpierw muszę go odblokować.
MediaRecorder m = new MediaRecorder();
c.unlock(); // the killer
m.setCamera(c);
Po tym odblokowaniu nie mogę już zmienić parametrów kamery i dlatego nie można zmienić stanu lampy błyskowej.
ja nie wiem, czy to jest rzeczywiście możliwe, aby to zrobić, ponieważ nie jestem najlepszy w java-hacking, ale tutaj jest to, co ja wiem:
- Camera.unlock() jest rodowitym metoda, więc nie mogę naprawdę zobaczyć mechanizm tył sposób blokuje mnie
- Camera.Parameter ma HashMap, który zawiera wszystkie jego parametry
- Camera.setParameters (parametry) wykonuje HashMap, konwertuje go do ciąg i przekazuje go natywnej metodzie
- Mogę wyeliminować wszystkie parametry, ale TORCH-MODE z HashMap i aparatu fotograficznego nadal będzie go akceptować.
Tak więc nadal mogę uzyskać dostęp do kamery, ale nie będzie ona niczego słyszała. (Co jest raczej w celu Camera.unlock())
Edit:
Po zbadaniu kodu macierzystego, widzę, że w CameraService.cpp moje rozmowy do Camera.setParameters (parametry) się odrzucony, ponieważ mój identyfikator procesu nie jest zgodny z identyfikatorem procesu, który zarejestrowała usługa aparatu fotograficznego. Wygląda więc na to, że to moja przeszkoda.
Edit2:
Wydaje się, że MediaPlayerService jest podstawową usługą, która przejmuje kontrolę aparatu podczas nagrywania wideo. Nie wiem, czy to możliwe, ale gdybym mógł jakoś uruchomić tę usługę w moim własnym procesie, powinienem móc pominąć wywołanie Camera.unlock().
Edit3:
Ostatnią opcją byłoby, gdybym mógł jakoś wskaźnik do CameraHardwareInterface. Wygląda na to, że jest to interfejs specyficzny dla urządzenia i prawdopodobnie nie obejmuje sprawdzania PID. Głównym problemem jest to, że jedynym miejscem, w którym mogę znaleźć wskaźnik, jest CameraService, a CameraService nie mówi.
Edit4: (kilka miesięcy później)
W tym momencie, nie sądzę, że jest możliwe, aby zrobić to, co początkowo chciał. Nie chcę usuwać pytania z wykluczonej szansy, że ktoś na nie odpowie, ale nie szukam odpowiedzi. (Chociaż otrzymanie prawidłowej odpowiedzi byłoby niesamowite.)
Naprawdę nie rozumiem, dlaczego uważasz, że to możliwe. Spodziewam się, że nagrywanie wideo będzie miało pełną kontrolę nad aparatem. Wymagałoby to specjalnego kodowania, aby umożliwić innym sterowanie kamerą w tym samym czasie. –
Całkowicie się zgadzam, nie sądzę, że w tej chwili jest to możliwe, po prostu pozostawiam pytanie tutaj na tym punkcie, że ktoś nieoczekiwanie znalazł sposób. – thepenguin77