Использование Camera Fla sh независимо от камеры, когда камера используется. Samsung Galaxy S8 - PullRequest
0 голосов
/ 16 января 2020

Я работаю над приложением, в котором камера используется для получения сигнала от источника света, и я хочу использовать камеру 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. Если да, то как мне создать отдельную ветку, где я могу это сделать точно?

...