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.