如何打开安卓手机的手电筒

10

更新

请查看我的回答

原始内容

我正在尝试在我的程序中打开LG Revolution的相机闪光灯。我使用了大多数手机上都适用的手电筒模式方法,但在LG手机上不起作用。有人知道如何让它在LG或特别是Revolution上工作吗?

这是我的清单:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>

这是我的当前代码:

public Camera camera = Camera.open();
    public Camera.Parameters Flash = camera.getParameters();

在我的 onCreate 方法中:

            Flash.setFlashMode("torch");
            Parameters p = camera.getParameters();
            camera.setParameters(Flash);
            camera.startPreview();

我看到有人使用自动对焦,但我不知道那是否可行。


那么现在还没有人知道如何做到这一点吗? - MinceMan
我已经尝试了所有能找到的方法,但迄今为止都没有成功...LG是否发布其特定Android实现的文档? - Nick Siderakis
我没有看到过,而且他们从未回复我通过他们网站设置的工单。 - MinceMan
不,我没有,Pedro。而且我认为我做不到,因为我没有LG硬件。希望有一天有人会在这个帖子上发布它... - MinceMan
5个回答

9

我想更新一下这篇文章,提供一些在几乎所有4.0+设备上都能正常运行的强大代码。

public void turnOn() {
    camera = Camera.open();
    try {
        Parameters parameters = camera.getParameters();
        parameters.setFlashMode(getFlashOnParameter());
        camera.setParameters(parameters);

        camera.setPreviewTexture(new SurfaceTexture(0));

        camera.startPreview();
        camera.autoFocus(this);
    } catch (Exception e) {
        // We are expecting this to happen on devices that don't support autofocus.
    }
}

private String getFlashOnParameter() {
    List<String> flashModes = camera.getParameters().getSupportedFlashModes();

    if (flashModes.contains(FLASH_MODE_TORCH)) {
        return FLASH_MODE_TORCH;
    } else if (flashModes.contains(FLASH_MODE_ON)) {
        return FLASH_MODE_ON;
    } else if (flashModes.contains(FLASH_MODE_AUTO)) {
        return FLASH_MODE_AUTO;
    }
    throw new RuntimeException();
}

关键是设置假的SurfaceTexture,这样预览才会真正开始。关闭它也很容易。

public void turnOff() {
        try {
            camera.stopPreview();
            camera.release();
            camera = null;
        } catch (Exception e) {
            // This will happen if the camera fails to turn on.
        }
}

请问您能分享一下getFlashOnParameter()方法吗? - Flyview
我期望得到一个+1的Flyview! - MinceMan
呵呵,我已经+1了 :) FLASH_MODE_AUTO 对于任何设备都有效吗?我自己构建了类似的逻辑,但只加入了 TORCH 和 ON。 - Flyview
我认为它过去曾经适用于三星,但我记不清了。 - MinceMan
1
可以在我的Umidigi A3 Pro上运行,需要添加以下代码:camera.setPreviewTexture(new SurfaceTexture(0)); - Red wine
显示剩余2条评论

1

测试一下:

if(camera == null){

camera = Camera.open();
parameters = camera.getParameters();

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

    if(flashModes != null && flashModes.contains(Parameters.FLASH_MODE_TORCH)){

        //appareil supportant le mode torch
        parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(parameters);
    } else if (flashModes != null && flashModes.contains(Parameters.FLASH_MODE_ON)){

        //spécial samsung
        parameters.setFlashMode(Parameters.FLASH_MODE_ON);
        camera.setParameters(parameters);
        camera.startPreview();
        camera.autoFocus(new AutoFocusCallback() {
            public void onAutoFocus(boolean success, Camera camera) { }
        });
    } else {
        parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(parameters);
    }  

        parameters.setFlashMode( Parameters.FLASH_MODE_OFF );
        camera.setParameters(parameters);
        camera.release();
        camera = null;

    } catch (RuntimeException e) {}

}//if

我会在下周的某个时候测试它。 - MinceMan
这对我似乎没有起作用。我正在添加自动对焦功能,等我有机会在LG手机上使用它时,我会看看它是否有效。尽管我不得不执行以下操作: camera.autoFocus(new Camera.AutoFocusCallback() { public void onAutoFocus(boolean success, Camera camera) { } - MinceMan
所以,使用自动对焦功能,LG的Spectrum™手机可以正常工作。不过我不确定它是否真的需要这个功能,或者只是因为这是另一款手机,我会进一步了解并更新信息。 - MinceMan
@ViToBrothers 我也同意 :/ 我已经尝试了Galaxy SII的所有可能变化 - 没有运气... 但我的代码在Sony Xperia S上可以运行。 - AgentKnopf

1

看起来 Android 市场上 Tiny Flashlight + LED 应用程序的开发者已经找到了如何让手电筒在 LG Revolution 上工作的方法。

也许你可以联系他并询问?你还可以检查他在应用程序中使用的权限,尝试让你的应用程序工作!

祝你好运!


Tiny Flasher 没有响应 :( 还不知道这个问题。 - MinceMan

0

这对LG Nexus效果很好:

camera = Camera.open();
camera.setPreviewTexture(new SurfaceTexture(0));
camera.setParameters(p);
camera.startPreview();

0
/*TESTED LG G4 */
public void flashOnOff(){
    List<String> flashModes = parameter001.getSupportedFlashModes();

    if(flashModes != null &&    flashModes.contains(Parameters.FLASH_MODE_TORCH)){

        //appareil supportant le mode torch
        parameter001.setFlashMode(Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(parameter001);
    } else if (flashModes != null && flashModes.contains(Parameters.FLASH_MODE_ON)){

        //spécial samsung
        parameter001.setFlashMode(Parameters.FLASH_MODE_ON);
        mCamera.setParameters(parameter001);

        mCamera.autoFocus(new AutoFocusCallback() {
            public void onAutoFocus(boolean success, Camera camera) { }
        });
    } else {
        parameter001.setFlashMode(Parameters.FLASH_MODE_OFF);
        mCamera.setParameters(parameter001);
    } 
    if (!isFlashOn) {
        if (mCamera == null || parameter001 == null) {
            return;
        }

        parameter001 = mCamera.getParameters();
        parameter001.setFlashMode(Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(parameter001);
        try {
            mCamera.setPreviewTexture(new SurfaceTexture(0));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mCamera.startPreview();
        isFlashOn = true;

        // changing button/switch image

    }else if (isFlashOn) {
        if (mCamera == null || parameter001 == null) {
            return;
        }

        parameter001 = mCamera.getParameters();
        parameter001.setFlashMode(Parameters.FLASH_MODE_OFF);
        mCamera.setParameters(parameter001);
        mCamera.stopPreview();
        isFlashOn = false;


    }
}

欢迎来到StackOverflow!通常情况下,答案如果包含解决方案的描述,即使答案似乎很明显,也会更受欢迎。 - JoelC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接