如何让相机灯按特定顺序闪烁?

How to make the camera light flash in a specific sequence?

我正在开发一个简单的摩尔斯电码应用程序,可以将英语转换为摩尔斯电码,反之亦然。当用户输入特定字母时,设备上的相机灯应该会闪烁该字母的摩尔斯序列,例如:

A = 点划线,点为 200 毫秒,划线为 500 毫秒。

问题是我不确定具体如何实现。我一直在尝试使用 for 循环来解决这个问题,但我似乎无法解决它。下面是我目前正在尝试调整的代码——我不确定使用 for 循环是否是最好的方法,但我想不出其他方法。有没有人有 suggestions/ideas,如果有的话,将不胜感激。

  public void flashTranslation() {

    char[] cArray = message.toCharArray();

    for (int i = 0; i < cArray.length; i++) {


        if (cArray[i] == '.') {
            turnOn();

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {
                    turnOff();

                    camera.release();
                }
            }, dot);

        } else {

            turnOn();

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {
                    turnOff();

                    camera.release();
                }
            }, dash);
        }

    }
}

public void turnOn() {

    if (camera != null) {
        Camera.Parameters p = camera.getParameters();
        p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(p);
        camera.startPreview();
    }


}

public void turnOff() {

    if (camera != null) {
        Camera.Parameters p = camera.getParameters();
        p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        camera.stopPreview();
    }
}

此代码可能给您带来问题的原因是灯关闭和再次打开之间没有时间。

瞬间,灯亮了。然后,runnable 在关闭之前等待 200 毫秒。关闭后,它会立即再次打开它,这意味着虽然从打开到关闭之间的时间点是 200 毫秒,但从关闭到重新打开之间的时间是(接近)0 毫秒。这可能导致灯看起来一直亮着,没有任何预期的暂停。

如果我没记错的话,创建一个新的 postDelayed 处理程序只是在一个新线程上执行一个 runnable,这并不是您真正想要的,因为您希望在队列中读取莫尔斯码.

尝试这样的事情:

public void flashTranslation() {
    int offIntervalTime = 50;

    char[] cArray = message.toCharArray();

    for (int i = 0; i < cArray.length; i++) {
        if (cArray[i] == '.') {
            turnOn();
            Thread.sleep(dot);

            turnOff();
            Thread.sleep(offIntervalTime);
        } else {
            turnOn();
            Thread.sleep(dash);

            turnOff();
            Thread.sleep(offIntervalTime);
        }
    }
}

您可能还需要为线程中断实现异常处理,但这是您可以使用的基本结构。注意有一个 offIntervalTime 变量。这用于定义灯应该关闭的恒定间隙,从而允许它实际闪烁。

当你调用这个函数时,确保它不在主线程上,所以在你调用它的地方做这样的事情:

Thread morseMessageThread = new Thread(new Runnable() { flashTranslation() });
morseMessageThread.start();