IT이야기

Android에서 카메라 손전등 사용

cyworld 2021. 10. 9. 14:38
반응형

Android에서 카메라 손전등 사용


위젯에서 카메라 LED 손전등을 사용하려고 합니다. 이 주제에 대해 여러 스레드를 찾았습니다(즉 , 나중에 언급된 스레드 ..). 이제 다음을 사용하여 조명을 제어하려고 합니다.

Camera cam = Camera.open();     
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.release();

AndroidManifest.xml에서 다른 권한을 시도했지만 현재 다음과 같습니다.

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

다른 Android 기기가 없기 때문에 Galaxy Tab에서 테스트하고 있습니다. 표시등이 켜지지 않습니다. 이제 몇 가지 질문이 있습니다.

  1. 에뮬레이터에서 led 조명 동작을 테스트하는 방법이 있습니까?
  2. 내가 여기서 뭔가 잘못하고 있습니까?
  3. 같은 문제를 다루는 질문 에 따르면 Galaxy Tab에서는 다르게 작동합니다. 어떻게?
  4. 그리고 마지막으로 다른 방식으로 작동한다면 갤럭시 탭만 그런 것인지 아니면 다른 기기에서도 다른 방식을 사용하는 것인지 궁금해지기 시작했습니다. 그때는 테스트하기가 어려울 것이고 제게는 다소 이상하게 보입니다.

어떤 통찰력을 주셔서 감사합니다!

그건 그렇고, 나는 여기에서 몇 번 언급되는 빠른 설정으로 빠르게 테스트했습니다 . 손전등은 빠른 설정에서도 작동하지 않습니다.

Galaxy Tab은 여전히 ​​Android 2.2를 사용합니다. 2.2와 2.3 사이에 약간의 변경 사항이 있음을 알 수 있습니다.

댓글: Galaxy Tab과 완벽하게 작동하는 시장의 다른 앱을 찾았기 때문에 어떻게든 작동해야 한다는 것을 압니다.

코멘트 2: cam.setParameters(p); getFlashMode()를 사용하여 카메라에 직접 현재 상태를 요청하면 FLASH_MODE_TORCH를 올바르게 반환합니다. 그러나 카메라를 놓았다가 다시 열면 FLASH_MODE_OFF가 반환됩니다. Camera 개체가 요청을 승인하지만 실제로 하드웨어에 전달하지 않는 것과 같습니다!?

--

Konstantins가 댓글을 남긴 후 cam.release()를 제거했습니다. 부분. 맞습니다. 카메라를 놓으면 설정이 유지되지 않습니다. cam.open()을 다시 사용하면 조명이 꺼진 상태에서 새 인스턴스를 얻을 수 있습니다. 그래도 갤럭시 탭에서는 조명이 작동하지 않습니다. 그래서 그때 위젯으로 제어하려고 하면 불이 켜진 상태를 유지하기 힘들 것 같아요. 백그라운드 서비스가 완료되는 즉시 카메라 객체가 자동으로 해제되므로 조명이 다시 꺼집니다. 내 질문은 여전히 ​​남아 있습니다. 특히 카메라가 처음부터 켜지지 않는 이유는 더욱 그렇습니다.


모든 장치는 약간 다릅니다. 삼성은 특히 앱 개발자를 복잡하게 만드는 것을 좋아합니다.

갤럭시 탭에서는 다음과 같은 장점이 있습니다.

Camera cam;
void ledon() {
    cam = Camera.open();     
    Parameters params = cam.getParameters();
    params.setFlashMode(Parameters.FLASH_MODE_ON);
    cam.setParameters(params);
    cam.startPreview();
    cam.autoFocus(new AutoFocusCallback() {
                public void onAutoFocus(boolean success, Camera camera) {
                }
            });
}

void ledoff() {
    cam.stopPreview();
    cam.release();
}

그래도 작동하지 않으면 처음에 FLASH_MODE_OFF를 설정하고 startPreview 후에 변경하는 문제일 수 있습니다.


매개변수를 설정한 후에는 카메라를 놓으면 안 됩니다. 미리보기를 시작한 후 플래시가 활성화된 것을 발견했습니다(토치 모드에서). ( 모토로라 디파이 2.1 에 적용 )

또한 활성화하기 전에 지원되는 플래시 모드를 확인하는 것이 좋습니다.

Android에서 카메라 설정을 어지럽히는 것은 가장 어두운 부두교입니다. 많은 장치가 다르게 작동하며 하나의 코드로 모든 장치를 대상으로 지정할 수 있는 신뢰할 수 있는 방법이 없는 것 같습니다. 가장 안전한 방법은 onResume() 메서드가 호출 될 때 항상 카메라를 올바르게 설정하는 것입니다 . 나는 또한 onConfigChange() 에서 동일한 작업을 수행하는 것을 고려할 것입니다 . 왜냐하면 적어도 Motorola 화면 잠금 장치는 응용 프로그램을 세로 모드로 강제 전환하여 완전히 다시 시작할 수 있기 때문입니다.

추신 카메라를 닫으면 기본 카메라 앱이 닫히고 새로운 상태로 재생성된다고 가정합니다.


많은 전화에서 작동하는 다음과 같은 방법으로 수행했습니다.

 String manuName = android.os.Build.MANUFACTURER.toLowerCase();
 Camera mCamera;

아래 코드는 조명을 끄고 켜는 방법을 보여줍니다.

  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();
            }
        }

        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) {
            count = 0;
            mCamera.stopPreview();
        }
    }
}

아래는 DroidLED 클래스입니다.

 class DroidLED {

    private Object svc = null;
    private Method getFlashlightEnabled = null;
    private Method setFlashlightEnabled = null;

    @SuppressWarnings("unchecked")
    public DroidLED() throws Exception {
            try {
                    // call ServiceManager.getService("hardware") to get an IBinder for the service.
                    // this appears to be totally undocumented and not exposed in the SDK whatsoever.
                    Class sm = Class.forName("android.os.ServiceManager");
                    Object hwBinder = sm.getMethod("getService", String.class).invoke(null, "hardware");

                    // get the hardware service stub. this seems to just get us one step closer to the proxy
                    Class hwsstub = Class.forName("android.os.IHardwareService$Stub");
                    Method asInterface = hwsstub.getMethod("asInterface", android.os.IBinder.class);
                    svc = asInterface.invoke(null, (IBinder) hwBinder);

                    // grab the class (android.os.IHardwareService$Stub$Proxy) so we can reflect on its methods
                    Class proxy = svc.getClass();

                    // save methods
                    getFlashlightEnabled = proxy.getMethod("getFlashlightEnabled");
                    setFlashlightEnabled = proxy.getMethod("setFlashlightEnabled", boolean.class);
            }
            catch(Exception e) {
                    throw new Exception("LED could not be initialized");
            }
    }

    public boolean isEnabled() {
            try {
                    return getFlashlightEnabled.invoke(svc).equals(true);
            }
            catch(Exception e) {
                    return false;
            }
    }

    public void enable(boolean tf) {
            try {
                    setFlashlightEnabled.invoke(svc, tf);
            }
            catch(Exception e) {}
    }

}

AndroidManifest.xml에서 다음 권한을 설정해야 합니다.

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

이것은 HTC Desire에서 저에게 효과적입니다 ... (2.2 포함) (물론 카메라 및 손전등 권한이 있음) :

    Camera mycam = Camera.open();
    Parameters p = mycam.getParameters();// = mycam.getParameters();
    p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
    mycam.setParameters(p); //time passes 
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    p.setFlashMode(Parameters.FLASH_MODE_OFF);
    mycam.release();

표면 보기를 추가할 수도 있습니다. 어떤 API로 제어 가능한 Galaxy Nexus의 LED 손전등에 대한 내 대답을 살펴보십시오 .


이 링크를 사용하십시오:

http://www.androidhive.info/2013/04/android-developing-flashlight-application/

저에게 매우 도움이 됩니다.


private Camera camera;
void openCam(){
    camera = Camera.open();
    if (camera != null) {
        Camera.Parameters params = camera.getParameters();
        camera.setParameters(params);
    }
    Camera.Parameters p = camera.getParameters();
    p.setFlashMode(Parameters.FLASH_MODE_TORCH);
    camera.setParameters(p);
}

매니페스트 에서 권한 설정 :

<uses-permission
    android:name="android.permission.FLASHLIGHT"
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
    android:protectionLevel="normal" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.flash" />

참조URL : https://stackoverflow.com/questions/5503480/use-camera-flashlight-in-android

반응형