[android] Android 플랫폼에서 “전면 카메라”를 열려면 어떻게합니까?

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

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

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



답변

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 버전에서 사용할 수 있습니다.


답변

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"


답변

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


답변

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


답변

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.
        }
    }
}


답변

후면 카메라 를 열려면 :-

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


답변

Android 2.3 (Gingerbread) 이 출시됨에 따라 이제 android.hardware.Camera클래스를 사용하여 카메라 수, 특정 카메라에 대한 정보를 가져오고 특정 Camera. 여기 에서 새로운 CameraAPI를 확인 하십시오 .