Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 尝试打开Led闪光灯电源时延迟几秒钟_Android_Camera_Android Camera_Led - Fatal编程技术网

Android 尝试打开Led闪光灯电源时延迟几秒钟

Android 尝试打开Led闪光灯电源时延迟几秒钟,android,camera,android-camera,led,Android,Camera,Android Camera,Led,我试图打开led闪光灯,但led闪光灯在延迟几秒钟后打开 我有一个内置的手电筒在我的手机,当我点击它的闪光立即打开 这里有什么问题 这是我的密码: private void processOnClick() { if (manuName.contains("motorola")) { DroidLED led; try { led = new DroidLED();

我试图打开led闪光灯,但led闪光灯在延迟几秒钟后打开

我有一个内置的手电筒在我的手机,当我点击它的闪光立即打开

这里有什么问题

这是我的密码:

private void processOnClick() {

            if (manuName.contains("motorola")) {
                DroidLED led;
                try {
                    led = new DroidLED();
                    led.enable(true);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else {
                if (mCamera == null) {
                    try {
                        mCamera = Camera.open();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                try {
                    mCamera = Camera.open();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                if (mCamera != null) {

                    final Parameters params = mCamera.getParameters();

                    List<String> flashModes = params.getSupportedFlashModes();

                    if (flashModes == null) {
                        return;
                    } else {
                        if (count == 0) {
                            params.setFlashMode(Parameters.FLASH_MODE_OFF);
                            mCamera.setParameters(params);
                            mCamera.startPreview();
                        }

                        String flashMode = params.getFlashMode();

                        if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {

                            if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
                                params.setFlashMode(Parameters.FLASH_MODE_TORCH);
                                mCamera.setParameters(params);
                            } else {
                                // Toast.makeText(this,
                                // "Flash mode (torch) not supported",Toast.LENGTH_LONG).show();

                                params.setFlashMode(Parameters.FLASH_MODE_ON);

                                mCamera.setParameters(params);
                                try {
                                    mCamera.autoFocus(new AutoFocusCallback() {
                                        public void onAutoFocus(boolean success, Camera camera) {
                                            count = 1;
                                        }
                                    });
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                }
            }

            if (mCamera == null) {
                return;
            }
        }

     private void processOffClick() {

            if (manuName.contains("motorola")) {
                DroidLED led;
                try {
                    led = new DroidLED();
                    led.enable(false);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else {
                if (mCamera != null) {
                    mCamera.stopPreview();
                    mCamera.release();
                }
            }
        }
我从stackoverflow周围的一些答案中获取了这个代码


谢谢你的帮助

摩托罗拉有高延迟吗

这只是猜测,但是DroidLED构造函数调用昂贵的系统初始化。 你不能这样做吗

public class MyWidgetClickHandler {
    private DroidLED = null;
    public MyWidgetClickHandler(string ManuName) {
        // This is slow. It will run once at initialization.
        if (ManuName != null && ManuName.toLowerCase().contains("motorola"))
            DroidLED = new DroidLED();
    }

    public void processOnClick() {
        if (DroidLED != null)
            DroidLED.enable(true);
        else
            ; // ... TODO
    }

    public void processOffClick() {
        if (DroidLED != null)
            DroidLED.enable(false);
        else
            ; // ... TODO
    }
}
可能还有更多。例如,您可以使用
enable
isEnabled
创建一个
LED
接口
,并为其创建两个实现。一个是
DroidLED
,另一个是
CommonCameraLED
。 这样看来:

public class LEDFactory {
    public static LED createLED(string ManuName) {
        if (ManuName != null && ManuName.toLowerCase().contains("motorola"))
            return new DroidLED();
        else
            return new CommonCameraLED();
    }
}

public class MyWidgetClickHandler {
    private LED myLed = null;
    public MyWidgetClickHandler(string ManuName) {
        myLed = LEDFactory.createLED(ManuName);
    }

    public void processOnClick() {
        myLed.enable(true);
        // NOTHING TO DO
    }

    public void processOffClick() {
        myLed.enable(false);
        // NOTHING TO DO
    }
}

您还可以创建一个初始化线程,这样手机启动速度就不会太慢。

我刚刚遇到了同样的问题并找到了解决方案,但我使用三星Galaxy S2进行了测试。此代码应适用于所有设备

通过分析每一个函数,我发现设置相机所需的一些调用的延迟总计达500ms,这使得频闪效果变得不可能

我的解决方案是将所有这些函数移到一个单独的函数中,当我想要获取相机时,我会调用该函数,并将“打开”代码简化为调用
camera.setParameters()
。通过这样做,延迟降到只有4ms

例如(为了证明这一点,减少了代码):

public class LEDFactory {
    public static LED createLED(string ManuName) {
        if (ManuName != null && ManuName.toLowerCase().contains("motorola"))
            return new DroidLED();
        else
            return new CommonCameraLED();
    }
}

public class MyWidgetClickHandler {
    private LED myLed = null;
    public MyWidgetClickHandler(string ManuName) {
        myLed = LEDFactory.createLED(ManuName);
    }

    public void processOnClick() {
        myLed.enable(true);
        // NOTHING TO DO
    }

    public void processOffClick() {
        myLed.enable(false);
        // NOTHING TO DO
    }
}
// First get the camera for your app (Keep this variables as class 

members so the live between functions)
private void acquireCamera()
{
    try
    {
        // Get camera
        cam = Camera.open(); 
        // This is not on your code but you should do it for compatibility
        mSurfaceTexture = new SurfaceTexture(0);
        cam.setPreviewTexture(mSurfaceTexture);
        cam.startPreview();
        camParams = cam.getParameters();
    }
    catch(IOException e)
    { /*...*/ }
}

// Then turn on / off as many times you want.
private void setTorch(boolean on)
{
    camParams.setFlashMode(on? Camera.Parameters.FLASH_MODE_TORCH : Camera.Parameters.FLASH_MODE_OFF);
    cam.setParameters(camParams);
}

// Finally release the camera when you`re done
private void releaseCamera
{
    camParams = null;
    cam.stopPreview();
    mSurfaceTexture = null;
    cam.release();
}