web-dev-qa-db-fra.com

Comment ouvrir la "caméra frontale" sur la plateforme Android?

Plus généralement, si un appareil dispose de plusieurs caméras intégrées, Existe-t-il un moyen d'initialiser l'une d'entre elles en particulier?

Je ne l'ai pas trouvé dans la documentation de référence Android:

Samsung SHW-M100S a deux caméras. S'il n'y a aucune référence à utiliser deux appareils photo, aucune idée de la façon dont Samsung a ...?

79
Sol
private Camera openFrontFacingCameraGingerbread() {
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            try {
                cam = Camera.open(camIdx);
            } catch (RuntimeException e) {
                Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
    }

    return cam;
}

Ajoutez les autorisations suivantes dans le fichier AndroidManifest.xml:

<uses-permission Android:name="Android.permission.CAMERA" />
<uses-feature Android:name="Android.hardware.camera" Android:required="false" />
<uses-feature Android:name="Android.hardware.camera.front" Android:required="false" />

Remarque: Cette fonctionnalité est disponible dans les versions Gingerbread (2.3) et Up Android.

113
user456118

Toutes les méthodes de réponses plus anciennes sont obsolètes par Google (supposément à cause de problèmes comme celui-ci), puisque vous devez utiliser l'API 21 pour utiliser l'API Camera 2:

Cette classe était obsolète dans l'API de niveau 21. Nous vous recommandons d'utiliser le nouveau fichier Android.hardware.camera2 API pour les nouvelles applications.

Dans l'API la plus récente _, vous disposez de de l'alimentation presque complète sur l'appareil photo du périphérique Android et de la documentation

String[] getCameraIdList()

puis utilisez obtenu CameraId pour ouvrir la caméra:

void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)

99% des caméras frontales ont id = "1" et la caméra arrière id = "0" Selon ce qui suit:

Les caméras non amovibles utilisent des entiers commençant à 0 pour leur identificateurs, tandis que les caméras amovibles ont un identifiant unique pour chaque appareil individuel, même s’ils sont du même modèle.

Cependant, cela signifie que si la situation de l'appareil est rare, par exemple si vous utilisez une tablette 1 caméra frontale, vous devez compter le nombre de caméras embedded dont vous disposez et placer l'ordre de la caméra par son importance ("0" ). Donc CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, ce qui implique que la caméra arrière est plus importante que frontale.

Je ne connais pas de méthode uniform pour identifier la caméra frontale sur tous les appareils Android. Simplement dit, le système d'exploitation Android à l'intérieur de l'appareil ne peut pas vraiment savoir quelle caméra est exactement à quel endroit pour certaines raisons: peut-être que le seul identifiant en dur de la caméra est un entier représentant son importance ou peut-être que sur certains appareils, quel que soit leur côté. retour".

Documentation: https://developer.Android.com/reference/Android/hardware/camera2/package-summary.html

Exemples explicites: https://github.com/googlesamples/Android-Camera2Basic


Pour l'ancienne API (ce n'est pas recommandé, car cela ne fonctionnera pas sur les téléphones modernes, la nouvelle version d'Android et le transfert est fastidieux). Utilisez simplement le même entier CameraID (1) pour ouvrir la caméra frontale comme dans cette réponse :

cam = Camera.open(1);

Si vous faites confiance à OPENCV pour faire la partie caméra:

À l'intérieur

    <org.opencv.Android.JavaCameraView
    ../>

utilisez les éléments suivants pour la caméra frontale:

        opencv:camera_id="1"
11
iantonuk

Depuis Android 2.1, Android ne prend en charge qu'un seul appareil photo dans son SDK. Il est probable que cela sera ajouté dans une future version Android. 

10
CommonsWare
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera = Camera.open();
        mCamera.setDisplayOrientation(90);
        mCamera.setPreviewDisplay(holder);

        Camera.Parameters p = mCamera.getParameters();
        p.set("camera-id",2);
        mCamera.setParameters(p);   
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
4
Mahesh

Pour API 21 (5.0) et les versions ultérieures, vous pouvez utiliser les API de CameraManager

try {
    String desiredCameraId = null;
    for(String cameraId : mCameraIDsList) {
        CameraCharacteristics chars =  mCameraManager.getCameraCharacteristics(cameraId);
        List<CameraCharacteristics.Key<?>> keys = chars.getKeys();
        try {
            if(CameraCharacteristics.LENS_FACING_FRONT == chars.get(CameraCharacteristics.LENS_FACING)) {
               // This is the one we want.
               desiredCameraId = cameraId;
               break;
            }
        } catch(IllegalArgumentException e) {
            // This key not implemented, which is a bit of a pain. Either guess - assume the first one
            // is rear, second one is front, or give up.
        }
    }
}
4
Airsource Ltd

Avec la sortie de Android 2.3 (Gingerbread), vous pouvez maintenant utiliser la classe Android.hardware.Camera pour obtenir le nombre de caméras, des informations sur une caméra spécifique et obtenir une référence à une Camera spécifique. Découvrez les nouvelles API Cameraici .

2
Wesley Wiser

build.gradle

 dependencies {
       compile 'com.google.Android.gms:play-services-vision:9.4.0+'
    }

Vue d'ensemble

CameraSourcePreview mPreview = (CameraSourcePreview) findViewById(R.id.preview);

GraphicOverlay mGraphicOverlay = (GraphicOverlay) findViewById(R.id.faceOverlay);

CameraSource mCameraSource = new CameraSource.Builder(context, detector)
                            .setRequestedPreviewSize(640, 480)
                            .setFacing(CameraSource.CAMERA_FACING_FRONT)
                            .setRequestedFps(30.0f)
                            .build();

           mPreview.start(mCameraSource, mGraphicOverlay);
0
Dheerendra Mitm
Camera camera;   
if (Camera.getNumberOfCameras() >= 2) {

    //if you want to open front facing camera use this line   
    camera = Camera.open(CameraInfo.CAMERA_FACING_FRONT);

    //if you want to use the back facing camera
    camera = Camera.open(CameraInfo.CAMERA_FACING_BACK);                
}

try {
    camera.setPreviewDisplay("your surface holder here");
    camera.startPreview();      
} catch (Exception e) {  
    camera.release();
}

/ * Ce n'est pas la bonne façon, c'est une solution pour les appareils plus anciens fonctionnant sous Android 4.0 ou une version antérieure Ceci peut être utilisé à des fins de test, mais pas recommandé pour le développement principal. Cette solution ne peut être considérée que comme une solution temporaire. Mais cette solution a aidé beaucoup alors je n'ai pas l'intention de supprimer cette réponse * / 

0
Amalan Dhananjayan