기기에 카메라가 있는지 확인 하시겠습니까?


80

내 앱에서 기기에 카메라가있는 경우 카메라를 사용하고 싶습니다. 카메라 가없는 Android를 실행하는 장치 가 있습니까? 내 매니페스트에 다음을 포함하여 :

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

기본적으로 "카메라가 있으면 사용하지만 앱을 실행하는 데 카메라가 필요하지 않습니다."라고 말합니다.

Camera 클래스를 사용하기 전에 장치에 카메라가 있는지 어떻게 확인할 수 있습니까?


1
Android 호환성 정의 문서 의 모든 과거 및 현재 버전이 최소 해상도의 카메라를 지정 한다고 믿습니다 (하지만 100 % 확실하지는 않습니다) . CDD를 준수하는 것은 Android Market 및 독점 Google 애플리케이션에 대한 라이센스 액세스의 전제 조건입니다. 하지만 그렇지 않은 Android 기기가 있습니다 (예 : Nook 색상).
— ephemient 2011 년

2
오늘 현재 문서 (4.2)의 현재 버전에서는 "기기 구현에는 후면 카메라를 포함해야하며 전면 카메라를 포함 할 수 있습니다."라고 명시되어 있습니다. 'MUST'키워드를 사용하지 않습니다.
— Matthew Blackford 2013

추가로 전면 카메라 만있는 장치도 있습니다.
— The Berga

앱이 카메라 없이도 작동해야한다고 말하면 매니페스트에 이것을 추가하는 것이 중요합니까? 아마도 Play 스토어의 앱에 영향을 미칩니 까?
— 안드로이드 개발자

답변:


-44

나는 그것을 시도하지 않았지만 :

private android.hardware.Camera mCameraDevice;

try {
  mCameraDevice = android.hardware.Camera.open();
} catch (RuntimeException e) {
  Log.e(TAG, "fail to connect Camera", e);
  // Throw exception
}

필요한 것일 수 있습니다.


그리고 카메라 오브젝트를 놓는 것을 잊지 마세요!
— opedog

11
기기에 카메라가 있는지 확인하는 올바른 방법은 아래 dpjanes 답변을 참조하세요.
— Zack Marrapese

22
잘못된 접근입니다. 비싼 전화. 다른 애플리케이션에서 동일한 카메라를 열면 RuntimeException이 발생합니다. 목적에 맞지 않습니다.
— 포인터 Null

5
이 대답은 너무 유명해졌습니다! :) meta.stackoverflow.com/a/316273/651647
— Farshid Zaker

Android 6.0 (API 레벨 23) 이상에서 구현하면 런타임에 "android.permission.CAMERA"권한을 특별히 요청하지 않는 한 SecurityException이 발생합니다.
— Matt G

224

이것이 내가 사용하는 것입니다.

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
}

테스트 할 다른 모든 재미있는 것들도 사용할 수 있습니다. 나침반, 위치, 전면 카메라 : http://developer.android.com/reference/android/content/pm/PackageManager.html


4
너무 빠른 질문입니다. 이것은 바보 일 수 있지만 나는 android / java를 처음 접했는데 어디서 컨텍스트를 얻습니까 ???? 감사합니다
— grobartn 2011

3
@grobartn :public class YourActivity extends Activity { Context contextActivity; PackageManager pm; @Override public void onCreate(Bundle savedInstanceState) { ... contextActivity = this; pm = contextActivity.getPackageManager(); ...
— Klofi

14
API 레벨 9부터 FEATURE_CAMERA 외에 FEATURE_CAMERA_FRONT를 확인할 수 있습니다. 예를 들어 Nexus 7 (전면 카메라가 하나만 있음)은 FEATURE_CAMERA에 false를 반환합니다.
— Jorge Cevallos 2012 년

6
Kindle Fire HD 7 "(Android 4.0.3)의 경우 전면 카메라 만 있지만 FEATURE_CAMERA를보고하는 것으로 나타났습니다. 끔찍합니다. 해결 방법으로 (FEATURE_CAMERA_FRONT 및 Camera.getNumberOfCameras () == 1 ) 그러면 후면 카메라가 없다는 것을 압니다
— CSmith

6
API 레벨 17 이후에는 PackageManager.FEATURE_CAMERA_ANY
— XY

42

장치에서 사용할 수있는 카메라 수를 확인하려면 다음으로 전화하십시오.

import android.hardware.Camera;

int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
  hasCamera = true;
}

Camera.getNumberOfCameras ()는 정적이므로 실제로 카메라에 연결할 필요가 없습니다. 이것은 API 9부터 작동합니다.

편집하다:

최신 camera2 API를 사용하면 개수뿐만 아니라 모든 유효한 카메라 ID 목록을 제공하는 CameraManager.getCameraIdList ()를 호출 할 수도 있습니다 .


2
이것은 나를 위해 일한와 FEATURE_CAMERA는 API 19에하지 않았다
— sobelito

한 줄 버전 : boolean hasCam = android.hardware.Camera.getNumberOfCameras ()> 0;
— J.Jacobs-VP

이 대답이 더 좋습니다. hasSystemFeature (PackageManager.FEATURE_CAMERA는) 키트 - 캣 (넥서스 7)에 false를 반환
— 키릴 Karmazin에

1
FEATURE_CAMERA는 이전 버전과의 호환성으로 인해 후면 카메라에 관한 것이기 때문에 Nexus 7 (2013)에 대해 false를 반환합니다. FEATURE_CAMERA_ANY는 장치에 모든 종류의 카메라가 하나 이상있는 경우 참인 기능입니다.
— Eddy Talvala

android.hardware.Camera더 이상 사용되지 않는 이유는 무엇 입니까? 이 기능을 위해 대신 무엇을 사용해야합니까? 나는 우리가 지금 가지고 있다는 것을 알고 android.hardware.camera2있지만, getNumberOfCameras거기에 대한 대안을 어디에서 찾을 수 있습니까?
— 안드로이드 개발자

12

당신은 당신의 장치에서 카메라를 찾기 위해 이것을 사용해야합니다

public static boolean isCameraAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}

1
이것이 가장 유용하다고 생각합니다. FEATURE_CAMERA_ANY는 좋은 선택입니다. 선호하는 사람들을위한 짧은 버전의 코드가 있습니다. public static boolean isCameraAvailable(Context context) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) }
— miva2 2015 년

6

Camera.getNumberOfCameras ()는 더 이상 사용되지 않습니다. 당신이 사용할 수있는:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int getNumberOfCameras() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        try {
            return ((CameraManager) getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length;
        } catch (CameraAccessException e) {
            Log.e("", "", e);
        }
    }
    return Camera.getNumberOfCameras();
}



3

다음 방법으로 장치에 카메라가 있는지 확인할 수 있습니다.

/** Check if this device has a camera */
    public static boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) 
        {
            return true;
        }
        else if(context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA_FRONT))
        {
            return true;
        }
        else {
            return false;
        }
    }

1

Android 2.3을 사용하는 경우 카메라 수 (전면 및 후면)와 같이 카메라 상태를 확인할 수있는 몇 가지 API가 있습니다.


1

이 시도

전면 카메라 용

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "NO");
          }

후면 카메라 용

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

        Utils.makeAlertDialog(context, "Has back Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has back Camera ?", "NO");
          }


0

문서에 따라 패키지 관리자를 사용하여 장치에서 카메라를 사용할 수 있는지 확인해야합니다.

자바 :

final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);

Kotlin에서 :

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

0

USB 카메라를 여러 번 연결하고 재생할 수있는 Android TV 상자에서 발견했습니다. 어떤 시점에서 카메라 서비스는 시스템에 카메라가 연결되어 있지 않은 상태에서 시스템에서 하나의 카메라를 감지했다고 말하기 시작합니다. 이것은 카메라를 여러 번 연결 / 분리 할 때 발생합니다. 이 문제를 해결하기 위해이 솔루션이 작동하는 것으로 나타났습니다.

//under oncreate:
//cameraManager = ((CameraManager) getSystemService(Context.CAMERA_SERVICE)); 

public int getNumberOfCameras() {
        int count_ = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try {
                count_ = cameraManager.getCameraIdList().length;

                if(count_==1)
                {
                    try {
                        cameraManager.getCameraCharacteristics(cameraManager.getCameraIdList()[0]);
                    }catch (Exception e)
                    {
                        count_ = 0;
                    }
                }

            } catch (Exception e) {
               //e.printStackTrace();
            }
        }
        else {
            count_ = Camera.getNumberOfCameras();
        }

        return count_;
    }

0

한 줄 솔루션 :

public static boolean hasCamera(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}

이 메소드를 Utils.java 프로젝트 클래스에 넣으십시오.

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