Как включить фонарик Android - PullRequest
9 голосов
/ 10 августа 2011

Обновление

Проверьте мой ответ

Оригинал

Я пытаюсь включить фонарик камеры на 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();

С моим созданием:

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

Я видел, как люди используют автофокус, но я не знаю, сработает ли это.

Ответы [ 5 ]

7 голосов
/ 02 августа 2014

Я подумал, что обновлю это с помощью некоторого bullet prof code, который работает почти на всех устройствах 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.
        }
}
1 голос
/ 22 декабря 2011

Проверьте это:

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
1 голос
/ 16 августа 2011

Похоже, что разработчик приложения Tiny Flashlight + LED на Android Market выяснил, как заставить фонарик работать на LG Revolution.

Может быть, вы можете связаться с ним и спросить?Вы также можете проверить разрешения, которые он использует в своем приложении, чтобы попытаться заставить ваше приложение работать!

Удачи!

0 голосов
/ 15 июня 2015
/*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;


    }
}
0 голосов
/ 06 января 2015

Это хорошо сработало для LG Nexus:

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