Sprawdź, czy urządzenie ma kamerę?


80

W mojej aplikacji chciałbym używać aparatu, jeśli urządzenie go ma. Czy są jakieś urządzenia z systemem Android, które nie mają aparatu? Dodając następujące informacje do mojego manifestu:

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

to po prostu mówi: „Użyję aparatu, jeśli taki istnieje, ale nie potrzebuję go do uruchomienia aplikacji”.

Jak mogę sprawdzić, czy w urządzeniu znajduje się kamera, przed próbą użycia klasy Camera?


1
Uważam (ale nie jestem w 100% pewien), że wszystkie poprzednie i obecne wersje dokumentu definicji zgodności systemu Android określają kamerę z jakąś minimalną rozdzielczością. Zgodność z CDD jest warunkiem wstępnym uzyskania licencjonowanego dostępu do Android Market i zastrzeżonych aplikacji Google. Istnieją jednak urządzenia z Androidem, które tego nie robią (np. Kolor Nook).
ephemient

2
Na dzień dzisiejszy w obecnej wersji dokumentu (4.2) określono, że „Implementacje urządzeń POWINNY obejmować kamerę skierowaną do tyłu, a MOGĄ obejmować kamerę skierowaną do przodu”. Zauważ, że nie używa słowa kluczowego „MUST”.
Matthew Blackford

Wystarczy dodać, że istnieją również urządzenia, które mają tylko przedni aparat.
Berga,

Czy dodawanie tego do manifestu ma sens, jeśli mówi, że aplikacja powinna działać z kamerą i bez niej? Czy może to wpłynąć na aplikację w Sklepie Play?
programista Androida

Odpowiedzi:


-44

Nie próbowałem, ale:

private android.hardware.Camera mCameraDevice;

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

Może być tym, czego potrzebujesz.


I nie zapomnij zwolnić obiektu Camera!
opedog

11
Zobacz odpowiedź dpjanes poniżej, aby dowiedzieć się, jak sprawdzić, czy urządzenie ma kamerę.
Zack Marrapese

22
Złe podejście. Drogie połączenie. Jeśli ta sama kamera jest otwierana przez inne aplikacje, spowoduje to zgłoszenie wyjątku RuntimeException. Nie pasuje do celu.
Pointer Null

5
Ta odpowiedź stała się tak sławna! :) meta.stackoverflow.com/a/316273/651647
Farshid Zaker

Ta implementacja w systemie Android 6.0 (poziom interfejsu API 23) + zgłosiłaby wyjątek SecurityException, chyba że w czasie wykonywania wyraźnie zażądano uprawnienia „android.permission.CAMERA”.
Matt G

224

Tego właśnie używam

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

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

Dostępnych jest również wiele innych fajnych rzeczy do przetestowania - kompas, jest dostępna lokalizacja, czy jest przedni aparat: http://developer.android.com/reference/android/content/pm/PackageManager.html


4
tak szybkie pytanie. to może być głupie, ale jestem nowy w Androidzie / Javie, skąd bierzesz kontekst ???? dzięki
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
Począwszy od poziomu API 9, możesz chcieć sprawdzić FEATURE_CAMERA_FRONT oprócz FEATURE_CAMERA. Na przykład Nexus 7 (który ma tylko jeden przedni aparat) zwraca wartość false do FEATURE_CAMERA.
Jorge Cevallos,

6
W przypadku Kindle Fire HD 7 "(Android 4.0.3) zauważyłem, że zgłasza FEATURE_CAMERA, mimo że ma tylko przednią kamerę! Okropne ... jako obejście testuję również (FEATURE_CAMERA_FRONT i Camera.getNumberOfCameras () == 1 ), to wiem, że nie ma tylnego aparatu
CSmith

6
Po API na poziomie 17 możesz używać PackageManager.FEATURE_CAMERA_ANY
XY,

42

Aby dowiedzieć się, ile kamer jest dostępnych na Twoim urządzeniu, możesz zadzwonić:

import android.hardware.Camera;

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

Camera.getNumberOfCameras () jest statyczna, więc nie wymaga faktycznego łączenia się z kamerą. Działa to od API 9.

Edytować:

Dzięki nowszemu interfejsowi API camera2 można również wywołać CameraManager.getCameraIdList () , która wyświetla listę wszystkich prawidłowych identyfikatorów kamer, a nie tylko liczbę.


2
to działało dla mnie, a FEATURE_CAMERA nie działało w API 19
sobelito

Wersja jednowierszowa: boolean hasCam = android.hardware.Camera.getNumberOfCameras ()> 0;
J.Jacobs-VP,

Ta odpowiedź jest lepsza. hasSystemFeature (PackageManager.FEATURE_CAMERA) zwraca false na Kit-Kat (Nexus 7)
Kirill Karmazin

1
Zwraca wartość false dla Nexusa 7 (2013), ponieważ FEATURE_CAMERA dotyczy tylko tylnych kamer (ze względu na kompatybilność wsteczną); FEATURE_CAMERA_ANY to funkcja, która jest prawdziwa, jeśli w urządzeniu jest co najmniej jedna kamera dowolnego rodzaju.
Eddy Talvala

Dlaczego jest android.hardware.Cameraprzestarzały? Czego należy użyć zamiast tej funkcji? Wiem, że teraz mamy android.hardware.camera2, ale gdzie możemy znaleźć alternatywę getNumberOfCameras?
programista Androida

12

Powinieneś użyć tego, aby znaleźć kamerę w swoim urządzeniu

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

1
Myślę, że jest to najbardziej przydatne. FEATURE_CAMERA_ANY to dobry wybór. Oto krótsza wersja kodu dla tych, którzy ją preferują. public static boolean isCameraAvailable(Context context) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) }
miva2

6

Camera.getNumberOfCameras () jest przestarzała. Możesz użyć:

@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

w następujący sposób możemy sprawdzić, czy urządzenie ma aparat, czy nie.

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

Jeśli używasz Androida 2.3, istnieje kilka interfejsów API, za pomocą których możesz sprawdzić stan aparatu, na przykład liczbę kamer (z przodu iz tyłu)


1

Spróbuj tego

Do przedniego aparatu

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

do aparatu z tyłu

    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

Zgodnie z dokumentacją musisz użyć Menedżera pakietów, aby sprawdzić, czy kamera jest dostępna na urządzeniu, czy nie

W Javie:

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

W Kotlinie:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

0

Znalazłem w pudełkach telewizyjnych z Androidem, w których można kilka razy podłączyć i odtwarzać kamerę USB. W pewnym momencie usługa kamery zaczyna mówić, że wykryła jedną kamerę w systemie, podczas gdy żadna kamera nie jest podłączona do systemu. Dzieje się tak, gdy kilka razy podłączasz / odłączasz kamerę. Aby to naprawić, okazało się, że to rozwiązanie działa:

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

Rozwiązanie jednoprzewodowe:

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

Umieść tę metodę w klasie projektu Utils.java.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.