Überprüfen Sie, ob das Gerät eine Kamera hat?


80

In meiner App möchte ich die Kamera verwenden, falls das Gerät eine hat. Gibt es Geräte mit Android, die keine Kamera haben? Indem ich Folgendes in mein Manifest aufnehme:

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

dann heißt es im Grunde "Ich werde eine Kamera verwenden, wenn eine existiert, aber keine brauche, um die App auszuführen".

Wie kann ich überprüfen, ob auf dem Gerät eine Kamera vorhanden ist, bevor ich versuche, die Kamera-Klasse zu verwenden?


1
Ich glaube (aber ich bin nicht 100% sicher), dass alle früheren und gegenwärtigen Versionen des Android-Kompatibilitätsdefinitionsdokuments eine Kamera mit einer Mindestauflösung angeben. Die Einhaltung der CDD ist eine Voraussetzung für den lizenzierten Zugriff auf den Android Market und proprietäre Google-Anwendungen. Es gibt Android-Geräte, die dies jedoch nicht tun (z. B. die Nook-Farbe).
Ephemient

2
Ab heute ist in der aktuellen Version des Dokuments (4.2) festgelegt, dass Geräteimplementierungen eine nach hinten gerichtete Kamera und möglicherweise eine nach vorne gerichtete Kamera enthalten sollten. Beachten Sie, dass das Schlüsselwort 'MUST' nicht verwendet wird.
Matthew Blackford

Nur um hinzuzufügen, dass es auch Geräte gibt, die nur eine nach vorne gerichtete Kamera haben.
Die Berga

Ist es sinnvoll, dies dem Manifest hinzuzufügen, wenn darin angegeben ist, dass die App mit und ohne Kamera funktionieren soll? Betrifft es vielleicht die App im Play Store?
Android-Entwickler

Antworten:


-44

Ich habe es nicht versucht, aber:

private android.hardware.Camera mCameraDevice;

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

Kann sein, was Sie brauchen.


Und vergessen Sie nicht, das Kameraobjekt freizugeben!
Opedog

11
In der Antwort von dpjanes unten finden Sie die richtige Methode, um festzustellen, ob ein Gerät über eine Kamera verfügt.
Zack Marrapese

22
Schlechter Ansatz. Teurer Anruf. Wenn dieselbe Kamera von anderen Anwendungen geöffnet wird, wird eine RuntimeException ausgelöst. Passt nicht zum Zweck.
Zeiger Null

5
Diese Antwort ist so berühmt geworden! :) meta.stackoverflow.com/a/316273/651647
Farshid Zaker

Diese Implementierung unter Android 6.0 (API Level 23) + würde eine SecurityException auslösen, es sei denn, Sie hätten zur Laufzeit ausdrücklich die Berechtigung "android.permission.CAMERA" angefordert.
Matt G

223

Das benutze ich

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

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

Alle möglichen anderen lustigen Dinge zum Testen sind ebenfalls verfügbar - der Kompass ist verfügbar, es gibt eine nach vorne gerichtete Kamera: http://developer.android.com/reference/android/content/pm/PackageManager.html


4
so schnelle Frage. Das mag dumm sein, aber ich bin neu in Android / Java. Woher bekommst du den Kontext? danke
grobartn

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

14
Ab API-Ebene 9 möchten Sie möglicherweise neben FEATURE_CAMERA nach FEATURE_CAMERA_FRONT suchen. Beispielsweise gibt Nexus 7 (das nur eine Frontkamera hat) false an FEATURE_CAMERA zurück.
Jorge Cevallos

6
Für Kindle Fire HD 7 "(Android 4.0.3) habe ich festgestellt, dass FEATURE_CAMERA gemeldet wird, obwohl es nur eine Frontkamera hat! Schrecklich ... als Problemumgehung teste ich auch (FEATURE_CAMERA_FRONT und Camera.getNumberOfCameras () == 1 ) dann weiß ich, dass es keine Rückfahrkamera gibt.
CSmith

6
Nach API Level 17 können Sie PackageManager.FEATURE_CAMERA_ANY
XY

42

Um herauszufinden, wie viele Kameras auf Ihrem Gerät verfügbar sind, können Sie Folgendes anrufen:

import android.hardware.Camera;

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

Camera.getNumberOfCameras () ist statisch, sodass keine Verbindung zu einer Kamera hergestellt werden muss. Dies funktioniert seit API 9.

Bearbeiten:

Mit der neueren camera2-API können Sie auch CameraManager.getCameraIdList () aufrufen , das eine Liste aller gültigen Kamera-IDs anstelle nur der Anzahl enthält.


2
Dies funktionierte für mich und die FEATURE_CAMERA nicht in API 19
sobelito

Einzeilige Version: boolean hasCam = android.hardware.Camera.getNumberOfCameras ()> 0;
J. Jacobs-VP

Diese Antwort ist besser. hasSystemFeature (PackageManager.FEATURE_CAMERA) gibt false auf Kit-Kat (Nexus 7) zurück
Kirill Karmazin

1
Für Nexus 7 (2013) wird false zurückgegeben, da es bei FEATURE_CAMERA nur um rückseitige Kameras geht (aufgrund der Abwärtskompatibilität). FEATURE_CAMERA_ANY ist die Funktion, die wahr ist, wenn sich mindestens eine Kamera auf dem Gerät befindet.
Eddy Talvala

Warum ist android.hardware.Cameraveraltet? Was soll stattdessen für diese Funktion verwendet werden? Ich weiß, wir haben jetzt android.hardware.camera2, aber wo können wir die Alternative dazu getNumberOfCamerasfinden?
Android-Entwickler

12

Sie sollten dies verwenden, um die Kamera in Ihrem Gerät zu finden

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

1
Ich denke, das ist das nützlichste. FEATURE_CAMERA_ANY ist eine gute Wahl. Hier ist eine kürzere Version des Codes für diejenigen, die es bevorzugen. public static boolean isCameraAvailable(Context context) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) }
miva2

6

Camera.getNumberOfCameras () ist veraltet. Sie können verwenden:

@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

Auf folgende Weise können wir überprüfen, ob das Gerät über eine Kamera verfügt oder nicht.

/** 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

Wenn Sie Android 2.3 verwenden, gibt es einige APIs, mit denen Sie Ihren Kamerastatus überprüfen können, z. B. die Anzahl der Kameras (Vorder- und Rückseite).


1

Versuche dies

Für Frontkamera

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

für Rückkamera

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

1

Gemäß Android-Dokumentation:

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

Weitere Informationen zur Kamera-API finden Sie unter:
https://developer.android.com/guide/topics/media/camera.html#detect-camera


0

Gemäß der Dokumentation müssen Sie den Paket-Manager verwenden, um zu überprüfen, ob die Kamera auf dem Gerät verfügbar ist oder nicht

In Java:

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

In Kotlin:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

0

Ich fand in Android-TV-Boxen, wo Sie USB-Kamera mehrmals anschließen und spielen können. Irgendwann meldet der Kameradienst, dass eine Kamera im System erkannt wurde, während keine Kamera an das System angeschlossen ist. Dies geschieht, wenn Sie die Kamera mehrmals ein- und ausstecken. Um dies zu beheben, funktionierte diese Lösung wie folgt:

//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

Einzeilige Lösung:

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

Fügen Sie diese Methode in Ihre Utils.java-Projektklasse ein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.