Android 플랫폼에서 "전면 카메라"를 열려면 어떻게합니까?


82

보다 일반적으로 장치에 내장 카메라가 두 개 이상있는 경우 특히 그 중 하나를 초기화하는 방법이 있습니까?

Android 참조 문서에서 찾지 못했습니다.

삼성 SHW-M100S에는 두 대의 카메라가 있습니다. 두 대의 카메라 사용에 대한 언급이 없다면 삼성이 어떻게했는지 알기 ...?


답변:


114
private Camera openFrontFacingCameraGingerbread() {
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            try {
                cam = Camera.open(camIdx);
            } catch (RuntimeException e) {
                Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
    }

    return cam;
}

AndroidManifest.xml파일에 다음 권한을 추가 하십시오.

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

참고 : 이 기능은 Gingerbread (2.3) 이상 Android 버전에서 사용할 수 있습니다.


Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);기존 카메라 앱을 여는 기술로 어떻게 든 사용할 수 있습니까?
— loeschg 2013 년

3
@loeschg Intent는 자체 방식으로 카메라 동작을 처리합니다. 이 기술은 SurfaceView카메라 기능을 이용 하기 위해 사용할 때 사용됩니다 .

그게 내가 생각한 것입니다. 감사!
— loeschg

2
아주 멋진 포스트. 카메라 방향이 반드시 카메라 인덱스와 동일하지 않다는 것을 알아내는 데 시간이 걸렸습니다. 예를 들어 내 태블릿에는 카메라가 하나만 있지만 (색인 : 0) 전면을 향합니다 (향면 색인 : 1). 따라서 Camera.open (CameraInfo.CAMERA_FACING_FRONT)과 같은 간단한 코드를 사용하는 것은 말도 안됩니다.
— Matthias

@Matthias 당신의 친구와 동의합니다. OEM이 다르기 때문에 프로그래밍 기술이 필요에 따라 변경됩니다. 강조 해주셔서 감사합니다.

14

API 21부터는 Camera 2 API 를 사용해야 하기 때문에 모든 이전 답변의 메서드는 Google에서 더 이상 사용하지 않습니다 (이와 같은 문제로 인해) .

이 클래스는 API 레벨 21에서 더 이상 사용되지 않습니다. 새 애플리케이션에는 새 android.hardware.camera2 API를 사용하는 것이 좋습니다.

에서 새로운 API , 당신은 거의 완벽한 전력 안드로이드 장치 카메라 및 문서에 명시 적으로 조언 이상을

String[] getCameraIdList()

그런 다음 얻은 CameraId를 사용하여 카메라를 엽니 다.

void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)

이에 따라 전면 카메라의 99 %는 id = "1"이고 후면 카메라 id = "0"입니다 .

비 이동식 카메라는 식별자로 0부터 시작하는 정수를 사용하는 반면, 이동식 카메라는 동일한 모델이더라도 각 개별 장치에 대해 고유 한 식별자를 사용합니다.

그러나 이는 1 개의 전면 카메라 태블릿처럼 기기 상황이 드물다 면 보유 하고있는 내장 카메라 수 를 세고 중요도 ( '0')에 따라 카메라를 정렬해야 함을 의미합니다. 따라서 CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, 이는 후면 카메라가 정면보다 더 중요하다는 것을 의미합니다 .

모든 Android 기기에서 전면 카메라를 식별 하는 통일 된 방법에 대해 모르겠습니다 . 간단히 말해서, 기기 내부의 Android OS는 어떤 이유로 어떤 카메라가 정확히 어디에 있는지 알 수 없습니다. 하드 코딩 된 유일한 카메라 ID는 중요성을 나타내는 정수이거나 어떤 기기에서든 어느 쪽을 향하든간에 .. " 뒤".

문서 : https://developer.android.com/reference/android/hardware/camera2/package-summary.html

노골적인 예 : https://github.com/googlesamples/android-Camera2Basic


이전 API의 경우 (최신 휴대 전화 최신 Android 버전에서는 작동하지 않고 전송이 고통스럽기 때문에 권장되지 않습니다). 이 답변 과 같이 전면 카메라를 열려면 동일한 Integer CameraID (1)를 사용하십시오 .

cam = Camera.open(1);

OpenCV 를 신뢰 하여 카메라 부분을 수행하는 경우 :

내부

    <org.opencv.android.JavaCameraView
    ../>

전면 카메라에 다음을 사용하십시오.

        opencv:camera_id="1"

10

Android 2.1부터 Android는 SDK에서 단일 카메라 만 지원합니다. 향후 Android 릴리스에 추가 될 가능성이 있습니다.


1
이 문구는 Android 2.2에서도 유효합니까?
— ozmank

2
@ozmank : 예, 다중 카메라 지원은 Android 2.3까지 추가되지 않았습니다.
— CommonsWare 2012

4
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera = Camera.open();
        mCamera.setDisplayOrientation(90);
        mCamera.setPreviewDisplay(holder);

        Camera.Parameters p = mCamera.getParameters();
        p.set("camera-id",2);
        mCamera.setParameters(p);   
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

3
Galaxy S 중요 "camera-id"에서 "camera_id"가 아니라 잘 작동 함
— Mahesh

3
90 도가 세로 방향으로 올바른 회전을 할 것이라고 가정하지 마십시오. 많은 장치에서 다릅니다.
— colintheshots

4

API 21 (5.0) 이상의 경우 CameraManager API의

try {
    String desiredCameraId = null;
    for(String cameraId : mCameraIDsList) {
        CameraCharacteristics chars =  mCameraManager.getCameraCharacteristics(cameraId);
        List<CameraCharacteristics.Key<?>> keys = chars.getKeys();
        try {
            if(CameraCharacteristics.LENS_FACING_FRONT == chars.get(CameraCharacteristics.LENS_FACING)) {
               // This is the one we want.
               desiredCameraId = cameraId;
               break;
            }
        } catch(IllegalArgumentException e) {
            // This key not implemented, which is a bit of a pain. Either guess - assume the first one
            // is rear, second one is front, or give up.
        }
    }
}

4

후면 카메라 를 열려면 :-

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

전면 카메라 를 열려면 :-

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
when {
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT)  // Tested on API 24 Android version 7.0(Samsung S6)
     }
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT) // Tested on API 27 Android version 8.0(Nexus 6P)
         cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true)
     }
     else -> cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", 1)  // Tested API 21 Android version 5.0.1(Samsung S4)
}
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

API 28 이상에서 작동하도록 만들 수 없습니다. 또한 일부 장치에서는 전면 카메라를 직접 열 수 없습니다 (제조업체에 따라 다름).


API 28 이상에 대한 해결책을 얻었습니까?
— Ankit Gupta


1

build.gradle

 dependencies {
       compile 'com.google.android.gms:play-services-vision:9.4.0+'
    }

보기 설정

CameraSourcePreview mPreview = (CameraSourcePreview) findViewById(R.id.preview);

GraphicOverlay mGraphicOverlay = (GraphicOverlay) findViewById(R.id.faceOverlay);

CameraSource mCameraSource = new CameraSource.Builder(context, detector)
                            .setRequestedPreviewSize(640, 480)
                            .setFacing(CameraSource.CAMERA_FACING_FRONT)
                            .setRequestedFps(30.0f)
                            .build();

           mPreview.start(mCameraSource, mGraphicOverlay);

0
Camera camera;   
if (Camera.getNumberOfCameras() >= 2) {

    //if you want to open front facing camera use this line   
    camera = Camera.open(CameraInfo.CAMERA_FACING_FRONT);

    //if you want to use the back facing camera
    camera = Camera.open(CameraInfo.CAMERA_FACING_BACK);                
}

try {
    camera.setPreviewDisplay("your surface holder here");
    camera.startPreview();      
} catch (Exception e) {  
    camera.release();
}

/ * 이것은 적절한 방법이 아닙니다. 이것은 Android 4.0 이상을 실행하는 구형 장치를위한 솔루션입니다. 테스트 목적으로 사용할 수 있지만 주요 개발에는 권장하지 않습니다. 이 솔루션은 임시 솔루션으로 만 고려할 수 있습니다. 하지만이 솔루션은 많은 사람들에게 도움이되었으므로이 답변을 삭제할 생각은 없습니다 * /


7
나는 그것이 문서화 된 사용법이라고 생각하지 않습니다. open (int id)은 카메라 위치가 아닌 id를 받아들입니다
— XY

13
이 오해의 소지가 대답 제거하십시오
— 알렉스 콘

13
@AmalanDhananjayan : 예를 들어 위의 @Matthias 의 댓글을 참조하세요 . … 예를 들어 내 태블릿에는 카메라가 하나만 있지만 (색인 : 0) 전면을 향합니다 (향면 색인 : 1). 따라서 Camera.open (CameraInfo.CAMERA_FACING_FRONT)과 같은 간단한 코드를 사용하는 것은 말도 안됩니다.
— 알렉스 콘

6
이것은 balderdash입니다. 이것을 사용하려고 시도하지 마십시오.
— 아담

4
이것은 끔찍합니다. 절대 이렇게하지 마십시오. 이 대답은 금지되어야합니다. Camera.open ()은 카메라가 향하는 서수 값이 아닌 카메라 ID를받습니다! 이것은 상당수의 장치에서 실패하며 순전히 멍청한 행운을 통해서만 작동합니다.
— colintheshots
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.