Я работаю над приложением, в котором камера используется для получения сигнала от источника света, и я хочу использовать камеру fla sh для отправки сигнала обратно. Чтобы сделать это, я хочу включить fla sh для 1 и отключить его для 0. Очевидно, что поскольку поток данных идет непрерывно, я не хочу делать это в UIThread, поэтому мне нужно сделать это в другом потоке и он должен иметь приоритет, чтобы задержка между переключателями включения и выключения была как можно более точной.
Я смог включить и выключить камеру fla sh во время работы приложения, но затем оно не не собирать никаких данных, потому что - я предполагаю, что он либо работал на UIThread, либо как-то блокировал другие функции.
previewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
mPrevRequest = previewBuilder.build();
mCamDrv.setRepeatingRequest(mPrevRequest, mCaptureCallback, mUIHandler);
try {
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
previewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
mPrevRequest = previewBuilder.build();
mCamDrv.setRepeatingRequest(mPrevRequest, mCaptureCallback, mUIHandler);
try {
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
Также это, например, мигает, но определенно не точно, так что, возможно, у кого-то есть идея о том, как сделать мигание более точным и, возможно, даже быстрее, чем 1 мс Я знаю, что это, вероятно, заставляет некоторых из вас съеживаться, поскольку я, вероятно, блокирую поток на 1 мс, но я новичок в Java и Android, и это лучшее, что я мог придумать для тестирования. Когда я пытался реализовать это в другом потоке, приложение просто зависало.
final Handler handler=new Handler();
for (int i = 0; i < 8; i++){
handler.postDelayed(new Runnable() {
@Override
public void run() {
try {
CaptureRequest.Builder previewBuilder =
mCamDrv.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
if (flashStatus) {
Log.i(TAG, "FlashOn called.");
previewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
flashStatus = false;
mPrevRequest = previewBuilder.build();
mCamDrv.setRepeatingRequest(mPrevRequest, mCaptureCallback, mUIHandler);
} else {
Log.i(TAG, "FlashOff called.");
previewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
flashStatus = true;
mPrevRequest = previewBuilder.build();
mCamDrv.setRepeatingRequest(mPrevRequest, mCaptureCallback, mUIHandler);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
handler.postDelayed(this, 1);
}
}, 0);}
Поэтому у меня возникли следующие вопросы: 1. Возможно ли даже на android создать точный сигнал с помощью камеры? sh во время работы камеры на частоте 1 кГц. 2. Если да, то как мне создать отдельную ветку, где я могу это сделать точно?