android - 如何在 Android 中创建快速或慢速相机闪光灯闪烁信号?

标签 android camera

我有发出闪烁信号的服务:

    public class FlashBlinkService extends Service 
    {
        private static Camera cam = null;
        private Handler handler = new Handler();

        @Override
        public IBinder onBind(Intent intent) 
        {
            return null;
        }

        @Override
        public void onCreate()
        {
            super.onCreate();
            startFlashBlink();      
        }

        //for simulating flash blink
        Runnable flashBlinkRunnable = new Runnable()
        {
            public void run() 
            {   
                cam = Camera.open();
                Parameters p = cam.getParameters();
                p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                cam.setParameters(p);
                cam.startPreview();
                p.setFlashMode(Parameters.FLASH_MODE_OFF);
                cam.setParameters(p);
                cam.stopPreview();
                cam.release();
                cam = null;
                //--->
                handler.post(flashBlinkRunnable);
            }       
        };

        //start flash blink light
        public void startFlashBlink()
        {
            flashBlinkRunnable.run();
        }

        //stop flash blink light
        public void stopFlashBlink()
        {
            handler.removeCallbacks(flashBlinkRunnable);
            stopCamera(cam);
        }

        //stop camera
        private void stopCamera(Camera cam)
        {
            if (cam != null)
            {
                cam.stopPreview();
                cam.release();
                cam = null;
            }
        }

        @Override
        public void onDestroy()
        {
            super.onDestroy();
            handler.removeCallbacks(flashBlinkRunnable);
            stopCamera(cam);
        }
    }

这是目前对我来说“最快”的闪光灯闪烁解决方案。哪个是制作更快或更慢的闪光闪烁信号的最佳方法?市场上有很多应用程序(如一些手电筒)提供此选项。谢谢。

最佳答案

我已经通过以下方式实现了这一点。频闪(闪光灯闪烁)的频率由 Thread.sleep() 函数中的 sleepMS 变量调节。例如,如果您想要以 10 Hz 的频率闪烁 10 次,您可以设置

sleepMS=(1/10)*50;
flashCount=10;

或者更一般的:

sleepMS=(1/Hz)*1000/2

不确定是否是实现此目的的最佳方式,但它确实有效。

Camera cam;
Parameters params;

private void main(){
    cam = Camera.open();
    params = cam.getParameters();
    cam.setPreviewTexture(new SurfaceTexture(0));
    cam.startPreview();

    for (int i = 0; i < flashCount; i++) {
        flipFlash();
        Thread.sleep(sleepMS);
        flipFlash();
        Thread.sleep(sleepMS);
    }
    cam.stopPreview();
    cam.release();
}

private void flipFlash(){
    if (isLighOn) {
        params.setFlashMode(Parameters.FLASH_MODE_OFF);
        cam.setParameters(params);
        isLighOn = false;
    } else{
        params.setFlashMode(Parameters.FLASH_MODE_TORCH);
        cam.setParameters(params);
        isLighOn = true;
    }
}

关于android - 如何在 Android 中创建快速或慢速相机闪光灯闪烁信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21064391/

相关文章:

android - 将 android 屏幕转换为 Jpeg 图像

ios - 添加手势捏缩放到相机预览层,iOS,Swift

c++ - 如何在应用颜色校正之前线性化输入图像?

android - 检查设备上是否安装了 Google map 应用程序

java - 在 AsyncTask 中捕获未处理异常的设计模式

java - 使用 rxAndroid 的 URL.openStream networkOnMainThread

iphone - iOS中的双摄像头输出

ios - UIImagePickerController allowsEditing=YES 仅用于视频

ios - GPUImage 直方图和丢帧

android - onActivityResult 方法错误