повторить азбуку с фонариком? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать приложение с азбукой Морзе, которое может воспроизводить азбуку Морзе встроенным фонариком. Поэтому я попробовал несколько вещей, одна из которых немного сработала, но не так, как должно.

Так что, по сути, я набираю сообщение, скажем "привет". Это переводится как

.... . .-.. .-.. ---

Тогда я хочу воспроизвести это, нажав кнопку. Я пробовал разные вещи. Это была моя первая попытка:

 public void onPlayflash(View view) throws InterruptedException, CameraAccessException {
    if (result == null) {
        output.setText("ERROR");
    } else {
        currentposition = 0;
        if (currentposition < result.length()) {
            String c = String.valueOf(result.charAt(0));
            if (c.equals("-")) {
                //timeinmillis = 1000;
                //setTimer();
                flash.setTorchMode(flash.getCameraIdList()[0], true);
                Thread.sleep(2000);
                flash.setTorchMode(flash.getCameraIdList()[0], false);
            } else if (c.equals(".")) {
                //timeinmillis = 500;
                //setTimer();
                flash.setTorchMode(flash.getCameraIdList()[0], true);
                Thread.sleep(1000);
                flash.setTorchMode(flash.getCameraIdList()[0], false);
            } else {
                Thread.sleep(2000);
            }
            currentposition += 1;
        }
    }
}

Это не сработало. Он просто сказал:

I/Choreographer: Skipped (*always a random number over 1000 here*) frames!  The application may be doing too much work on its main thread.

Тогда я попробовал

public void onPlayflash(View view) throws InterruptedException, CameraAccessException {
    if (result == null) {
        output.setText("ERROR");
    } else {
        for (int i = 0; i < result.length(); i++) {
            String c = String.valueOf(result.charAt(i));
            if (c.equals("_")) {
                flash.setTorchMode(flash.getCameraIdList()[0], true);
                Thread.sleep(2000);
                flash.setTorchMode(flash.getCameraIdList()[0], false);
                Thread.sleep(500);
            } else if (c.equals(".")) {
                flash.setTorchMode(flash.getCameraIdList()[0], true);
                Thread.sleep(1000);
                flash.setTorchMode(flash.getCameraIdList()[0], false);
                Thread.sleep(500);

            } else {
                Thread.sleep(1500);
            }
        }
    }
}

Это вроде сработало, но все равно написано

I/Choreographer: Skipped (*always a random number over 1000 here*) frames!  The application may be doing too much work on its main thread.

На самом деле воспроизведение начинается нормально, но затем оно начинает бороться и пропускает части итерации.

Как видите, я также экспериментировал с android.os.CountDownTimer, но это не сработало. У меня только одна вспышка, а потом она остановилась.

Как вы могли заметить, я еще не настолько опытен '^^ Надеюсь, ты сможешь мне помочь. Заранее спасибо!

1 Ответ

0 голосов
/ 29 октября 2018

попробуйте еще раз с CountDownTimer, но с использованием рекурсии и передачей списка времени ожидания

private void test(List<Integer> resultTimeList, Integer count) {
    flash.setTorchMode(flash.getCameraIdList()[0], true);
    new CountDownTimer(resultTimeList.get(count), 500) {
        public void onTick(long millisUntilFinished) {
        }

        public void onFinish() {
            new CountDownTimer(500, 500) {
                public void onTick(long millisUntilFinished) {
                }

                public void onFinish() {
                    flash.setTorchMode(flash.getCameraIdList()[0], false);
                    test(resultTimeList, count++);
                }
            }.start();

        }
    }.start();
}
...