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?

znak
źródło
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.

user197385
źródło
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

dpjanes
źródło
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ę.

Eddy Talvala
źródło
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);
}
Vishwa
źródło
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();
}
Szczery
źródło
6

Użyj metody PackageManager.hasSystemFeature () , aby sprawdzić kamerę:

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

Źródło: https://developer.android.com/guide/topics/media/camera.html#custom-camera

Nurul Akter Towhid
źródło
3

Spróbuj tego :

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

z: http://developer.android.com/guide/topics/media/camera.html

samaniego
źródło
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;
        }
    }
DjP
źródło
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)

mabeiyi
źródło
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");
          }
Pan T.
źródło
1

Zgodnie z dokumentacją systemu Android:

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

Więcej informacji o interfejsie API aparatu:
https://developer.android.com/guide/topics/media/camera.html#detect-camera

Googlian
źródło
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)
Srikar Reddy
źródło
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_;
    }
Sourja Banerjee
źródło
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.

Henrique Monte
źródło