더 이상 사용되지 않는 메모없이 이전 및 새로운 API 버전을 지원하기 위해 Android 카메라 또는 camera2 API를 사용하는 방법은 무엇입니까?


135

새로운 camera2 API가 혼란 스럽습니다. 장치의 카메라를 사용 하는 앱 (Android API 10-21 용) 을 개발하고 싶습니다 . 여기 에 언급 된대로 "카메라"API를 사용해야합니다.

그러나 매니페스트의 사용자 기능에 "카메라"API (android.hardware.Camera) 를 추가하려고하면 사용되지 않는 것으로 표시됩니다 . 반면, Android API 21+ (Android 5-Lollipop) 와만 호환되므로 "camera2"API (android.hardware.camera2)로 변경할 수 없습니다. 링크해도되지만 추가 할 수는 있습니다. 2 개의 링크.

내 앱이 이전 버전의 Android뿐만 아니라 최신 버전에서도 실행되기를 원합니다 ...

답변:


152

이전 카메라 API는 더 이상 사용되지 않는 것으로 표시 되어도 여전히 완벽하게 작동하며 Play 스토어의 거의 모든 카메라 사용 응용 프로그램에서 현재 사용하는 것처럼 꽤 오랫동안 유지됩니다.

더 이상 사용되지 않는 Android Studio의 불만을 무시해야하지만 21 이전의 Android 버전을 지원하려면 이전 API를 사용해야합니다.

API 레벨 21에서는 새로운 API와 새로운 기능을 사용할 수 있지만 현재는 API간에 전환 할 경우 앱에서 완전히 별도의 흐름을 유지해야합니다. 불행히도, 두 API는 이전과 마찬가지로 장치가 새로운 API와 같은 것을 사용할 수있는 지원 라이브러리를 작성하기가 어렵다는 세계관과는 충분히 다릅니다 (라이브러리가 새 API에서 이전 API로 매핑되는 경우) API 21 이상).


1
좋은 대답입니다. 따라서 API 레벨 16 이상을 지원하려면 지금은 기존 카메라를 사용하는 것이 좋습니다.
Loolooii 2016 년

5
그래서 유일한 방법은 if ​​문과 android.os.Build.VERSION.SDK_INT를 사용하여 코드를 분리하는 것입니까?
hadi

따라서 개발자의 경우 API 21 이상 만 대상으로하는 경우 Camera2를 사용하지만 레거시 지원이 필요한 경우 카메라를 사용 하시겠습니까? 아니면 다른 API를 사용하여 빌드 버전을 감지하고 서로 다른 두 가지 방법을 코딩하는 것이 좋습니다.
john.weland

2
앱의 기능에 따라 다릅니다. 카메라 기능이 간단한 포인트 앤 슛 방식이고 이전 API를 대상으로하려면 이전 카메라 API를 사용하십시오. 그러나 JPEG를 가져 와서 미리보기를 그리는 것 이상의 것을 원하거나 새로운 API를 대상으로하는 경우 camera2를 사용하십시오. (하드) 중간에는 camera2에서 멋진 옵션 기능을 제공하지만 오래된 장치에서도 작동하는 앱이 있습니다. 여기에서 각 API마다 하나씩 두 개의 별도 코드 경로를 빌드해야합니다.
Eddy Talvala

21
카메라 API를 더 이상 사용하지 않는 것은 실수 였으므로 카메라 고급 API (완전한 카메라 앱과 같은 고급 앱의 경우)를 도입해야했습니다. 그렇지 않으면 카메라를 사용하여 사진을 찍는 데 사용하는 대부분의 앱은 2 api를 유지해야합니다. 구글은 (언제나처럼) 적어도 컴팩트 라이브러리를 도입해야한다
Sudara

38

필요한 카메라의 모든 메소드를 인터페이스에 넣고 다음과 같은 카메라 인스턴스를 만듭니다.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Log.d(TAG, "camera2 selected");
        this.camera = new Camera2(getContext());
    } else {
        Log.d(TAG, "camera1 selected");
        this.camera = new Camera1(getContext());
    }

이렇게하면 모든 것이 갈라지고 인생이 훨씬 쉬워집니다.

조언의 말씀-camera2의 삶은 그리 좋지 않습니다. 벤더는 여전히 헛소리를 구현하므로 많은 조건과 해결 방법을 추가해야합니다.

예 1-S6은 플래시를 지원하지 않는다고보고합니다.) 예 2-LG 장치는 지원되는 이미지 크기 목록을 다시보고하지만 모든 이미지가 실제로 지원되는 것은 아닙니다 !!


14
사실입니다. Camera 2 API는 실제로 카메라 장치를 LEGACY, LIMITED 및 FULL의 세 가지 범주로 나눕니다. 카메라가 LEGACY로 분류되면 모든 camera2 API 호출이 후드 아래에서 camera1로 변환되므로 실제로 귀찮은 가치가 없습니다. 내 제안은 CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... 사실이라면 이전 API 를 호출 하고 선택하는 것입니다.
panonski

9

원하는 API를 지원하려면 아래 코드를 사용하십시오. 적절한 이름에 해당하는 API 레벨을 결정하십시오. 예를 들어, API 21은 LOLLIPOP이고 API 15는 ICE_CREAM_SANDWICH_MR1입니다.

 if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)  
                                    && ((Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))) {
           // your code here - is between 15-21

 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           // your code here - is api 21
 }

33
이것은 완전한 카메라 구현에는 거의 실용적이지 않습니다. 또한 두 개의 코드 경로를 유지해야합니다. 버전 확인은 안드로이드 개발에서 사용되지만 그렇지 않습니다.
katzenhut

5
사용자가 Build.VERSION_CODES.LOLLIPOP_MR1을 실행중인 경우 어떻게됩니까? 아니면 그 이상입니까? 두 번째 점검은 "else if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ralph Pina

친애하는 여러분, 내 앱이 16 및 최신 API에서 작동 해야하는 경우 동일한 apk camera2 및 이전 api에서 어떻게 빌드 할 수 있습니까? 이 작품에 맛이 좋은가요?
Mateus

두 API를 모두 구현해야합니다. 카메라 기능이 구현되는 인터페이스와 두 가지 클래스 만 유지하십시오. 카메라 실행을위한 인스턴스 중 하나를 만들기 전에 위에서 언급 한 방법을 호출하여 호출 할 클래스와 기능을 확인하십시오.
user0770

3

Google에서 권장하는 것은 Camera2 Api> = 21을 사용하지만 수동 설정에 문제가있을 수 있습니다.

자동 설정 모드로 사진을 찍기 위해 앱을 구현 해야하는 경우 제대로 작동합니다. 그러나! API> = 21 인 장치의 경우 수동 설정 모드 구현으로 앱을 작성해야하는 경우 먼저 하드웨어 지원 레벨 확인이 필요합니다.

카메라 (정면, 얼굴)를 선택하고 특성을 파악한 후 하드웨어 수준을 확인하십시오.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

카메라 특성은 다음 지원 레벨을 나타냅니다 : LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

높은 수준에서 수준은 다음과 같습니다.

LEGACY 장치는 구형 Android 장치의 하위 호환성 모드에서 작동하며 기능이 매우 제한적입니다.

제한 장치는 기본 기능 세트를 나타내며 FULL의 하위 세트 인 추가 기능을 포함 할 수도 있습니다.

FULL 장치는 센서, 플래시, 렌즈 및 사후 처리 설정 및 이미지 캡처를 프레임 당 수동 제어하는 ​​기능을 추가로 지원합니다.

LEVEL_3 장치는 추가 출력 스트림 구성과 함께 YUV 재 처리 및 RAW 이미지 캡처를 추가로 지원합니다.

LEGACY supprot 레벨 을 얻은 경우 오래된 Camera Api 합니다 .



0

Plz 읽기 링크 카메라 버전 지원 그들은 다음과 같이 진술합니다 ....
카메라 API1
Android 5.0 지원 중단됨 카메라 API1, 새로운 플랫폼 개발이 카메라 API2에 초점을 맞추면서 계속 단계적으로 폐지되고 있습니다. 그러나 단계적 기간이 길어지고 Android 릴리스는 한동안 카메라 API1 앱을 계속 지원할 것입니다. 특히 다음에 대한 지원이 계속됩니다.

  • 앱용 카메라 API1 인터페이스 Camera API1 위에 구축 된 카메라 앱은 이전 Android 릴리스 버전을 실행하는 장치에서와 마찬가지로 작동합니다.
  • 카메라 HAL 버전. 카메라 HAL1.0에 대한 지원을 포함합니다.

  • -1

    가장 좋은 옵션은 두 가지 활동을 만드는 것입니다. 일반적인 방법으로 현재 장치 API 확인

    Intent i;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        i = new Intent(context,camera2.class)
    } else {
        i = new Intent(context,camera.class);
    }
    startActivity(i);

    이렇게하면 코드를 다시 볼 때 많은 혼란을 겪을 필요가 없습니다. 코드는 분리되어 있으므로 쉽게 수정할 수 있습니다.

    당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
    Licensed under cc by-sa 3.0 with attribution required.