2014-09-29 5 views
6

Wie erkenne ich, ob das Gerät eine Kamera auf der RÜCKSEITE hat?Android/Java: Erkennen, ob das Gerät eine BACK-Kamera hat

Dies ist mein Code zu erkennen, ob das Gerät eine Taschenlampe hat:

if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH) 
    || (_camera.getParameters().getSupportedFlashModes() != null)) hasFlashlight = true; 
else hasFlashlight = false; 

Aber es ist TRUE auch wenn das Gerät nur eine Frontkamera ohne Taschenlampe hat.

+0

Diese Antwort sollte zu Ihnen passen: http: // stack overflow.com/questions/14399333/detecting-lack-of-rear-camera – Alboz

+0

BTW, kann ich 'Camera.open (Camera.CameraInfo.CAMERA_FACING_BACK);' nur um die BACK-Kamera zu öffnen? –

+1

"Kann ich Camera.open (Camera.CameraInfo.CAMERA_FACING_BACK) verwenden, nur um die BACK-Kamera zu öffnen?" - nein, da der Parameter zu 'open()' keine Eigenschaft wie 'CAMERA_FACING_BACK' ist. – CommonsWare

Antwort

15

Für API> = 9: Sie Camera.getCameraInfo mit so etwas wie diese verwenden:

int backCameraId = -1; 
for(int i=0;i<Camera.getNumberOfCameras();i++){ 
    CameraInfo cameraInfo = new CameraInfo(); 
    Camera.getCameraInfo(i,cameraInfo); 
    if(cameraInfo.facing==CameraInfo.CAMERA_FACING_BACK) { 
     backCameraId = i; 
     break; 
    } 
} 
Log.d(TAG, "back camera exists ? "+(backCameraId>-1)); 
Log.d(TAG, "back camera id :"+backCameraId); 

Für API> = 21, haben Sie die Camera2 API verwenden empfohlen:

String backCameraId = null; 
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
for(String cameraId:manager.getCameraIdList()){ 
    CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId); 
    Integer facing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING); 
    if(facing==CameraMetadata.LENS_FACING_BACK) { 
     backCameraId = cameraId; 
     break; 
    } 
} 
Log.d(TAG, "back camera exists ? "+(backCameraId!=null)); 
Log.d(TAG, "back camera id :"+backCameraId); 
+0

Kann ich diese Codes in Android 2.2 mit @ SuppressLint oder @ TargetApi verwenden? –

+1

Dieser Code erfordert API 9+ (2.2.3) Beachten Sie, dass Android 2.2 etwa 0,7% des Marktes ist (https://developer.android.com/about/dashboards/index.html). Wenn Sie wirklich 2.2 Kompatibilität benötigen, müssen Sie diesen Code schützen (siehe: http://developer.android.com/training/basics/support-devices/platforms.html) – ben75

+0

Großartig! Ich würde nur hinzufügen ** break; ** nach Zeile * backCameraId = i; * und ersetzen "Kamera-ID:" mit ** "Kamera-Index:" ** – 1111161171159459134

2

Versuchen Sie, die Anzahl der Kameras überprüfen:

import android.hardware.Camera; 

int numberOfCameras = Camera.getNumberOfCameras(); 

Wenn es größer als 1 ist, ziemlich sicher, dass eine hintere Kamera bekam.

+1

Danke, aber 'getNumberOfCameras()' ist NICHT für Android 2.2 oder weniger ... ("Kann kein Symbol finden") –

+5

@YoushaAleayoub: Es gab keine Frontkamera-Unterstützung für Android 2.2 und früher. Bei diesen Geräten handelt es sich also bei einer Kamera um eine nach hinten gerichtete Kamera. Nehmen wir an, dass die Anzahl der Kameras nicht angibt, ob eine Kamera nach hinten gerichtet ist - verwenden Sie in der anderen Antwort den Ansatz von ben75. – CommonsWare

+3

@YoushaAleayoub Wenn Sie es benötigen, um auf Android 2.2 und älter zu arbeiten, dann sollten Sie das zu Ihrer Frage hinzufügen. Android 2.3 ist wirklich die älteste Version, die den meisten Entwicklern wichtig ist. – Intrications

1
public boolean isRearCameraAvailable(Context context) { 
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); 
} 

Prüft, ob das Gerät eine Kamera vom Gerätebenutzer weg zeigt

Verwandte Themen