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


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.