Мне нужен способ управлять вспышкой камеры на устройстве Android, когда он записывает видео. Я создаю приложение для стробоскопа, и съемка с мигающим светом строба приведет к возможности записи объектов, движущихся с высокой скоростью, например, лопасти вентилятора.
Вспышку можно включить только путем запуска предварительного просмотра видео и установки FLASH_MODE_TORCH в параметрах камеры. Это будет выглядеть так:
Camera c = Camera.open();
Camera.Parameters p = c.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(p);
c.startPreview();
Как только предварительный просмотр запущен, я могу перевернуть этот параметр взад и вперед, чтобы включить и выключить свет. Это работает хорошо, пока я не попытаюсь записать видео. Проблема в том, что для того, чтобы дать камеру MediaRecorder, я сначала должен ее разблокировать.
MediaRecorder m = new MediaRecorder();
c.unlock(); // the killer
m.setCamera(c);
После этой разблокировки я больше не могу изменять параметры камеры и поэтому не могу изменить состояние вспышки.
Я не знаю, действительно ли это возможно, поскольку я не лучший в java-взломе, но вот что я знаю:
- Camera.unlock() - это собственный метод, поэтому я не могу увидеть механизм, который блокирует меня.
- Camera.Parameter имеет HashMap, который содержит все его параметры
- Параметры Camera.setParameters(Parameters) принимают HashMap, преобразуют его в строку и передают его собственному методу
- Я могу удалить все параметры, но TORCH-MODE из HashMap, и камера все равно примет его
Итак, я все еще могу получить доступ к Camera, но он не будет слушать ничего, о чем я говорю. (Какова цель Camera.unlock())
Edit:
После изучения собственного кода я вижу, что в CameraService.cpp мои вызовы на Camera.setParameters(Parameters) отклоняются, потому что мой Идентификатор процесса не соответствует идентификатору процесса, на котором установлена служба камеры. Таким образом, казалось бы, это мое препятствие.
Edit2:
Похоже, что MediaPlayerService является основной услугой, которая управляет камерой при записи видео. Я не знаю, возможно ли это, но если бы я мог как-то запустить эту службу в моем собственном процессе, я должен был бы пропустить вызов Camera.unlock().
Edit3:
Один из последних вариантов был бы, если бы я мог каким-то образом получить указатель на CameraHardwareInterface. По внешнему виду это интерфейс, специфичный для устройства, и, вероятно, не включает проверки PID. Основная проблема заключается в том, что единственное место, где я могу найти указатель на него, - в CameraService, а CameraService не говорит.
Edit4: (несколько месяцев спустя)
В этот момент я не думаю, что можно делать то, что я изначально хотел. Я не хочу удалять вопрос о том, что кто-то отвечает на него, но я не активно ищу ответ. (Хотя получение правильного ответа было бы удивительным.)