переиграть морсекод с фонариком?

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

По сути, я набираю сообщение, скажем, «привет». Это переводится как

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

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

 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, но это тоже не сработало. У меня была только одна вспышка, а потом она прекратилась.

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


person Max B.    schedule 29.10.2018    source источник
comment
Попробуйте прошить экран черным белым. Ты будешь приятно удивлен.   -  person danny117    schedule 29.10.2018


Ответы (1)


попробуйте еще раз с 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();
}
person Gnk    schedule 29.10.2018
comment
Большое спасибо!! Я сделал аналогично. Вместо списка я использовал HashMap (у меня сработало лучше) и было несколько проблем с final-объявлениями параметров, но в итоге получилось отлично! Я даже не замерзаю! Только небольшая проблема: приложение вылетает после успешного воспроизведения, но я думаю, что смогу это исправить. Черт, как хорошо! - person Max B.; 01.11.2018
comment
На самом деле вам даже не понадобится дополнительный таймер в методе onFinish(). - person Max B.; 02.11.2018