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.