Comment ouvrir la "caméra avant" sur la plate-forme Android?

Plus généralement, si un appareil possède plus d'une caméra intégrée, y at-il un moyen d'initialiser l'un d'entre eux en particulier?

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

  • Comment placer les boutons sur l'image dans Android?
  • Gradle Duplicate Entry: java.util.zip.ZipException
  • Lecture simultanée simultanément de vidéos simultanément
  • * Toute * façon de lier des graphiques Android / dessinables à / assets?
  • Comment puis-je centrer le texte horizontalement et verticalement dans un TextView sur Android?
  • Un service Android est-il garanti pour appelerDestroy ()?
    • Https://developer.android.com/reference/android/hardware/Camera.html
    • Https://developer.android.com/reference/android/hardware/camera2/package-summary.html
    • Https://developer.android.com/reference/android/hardware/camera2/CameraManager.html

    Samsung SHW-M100S dispose de deux caméras. S'il n'y a pas de référence pour utiliser deux caméras, une idée de la façon dont Samsung a fait …?

    8 Solutions collect form web for “Comment ouvrir la "caméra avant" sur la plate-forme Android?”

    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 Gingerbread (2.3) et la version Android Up.

    Depuis Android 2.1, Android prend en charge une seule caméra dans son SDK. Il est probable que cela sera ajouté dans une future version d'Android.

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

    Cette classe a été obsolète au niveau API 21. Nous recommandons d'utiliser la nouvelle API android.hardware.camera2 pour de nouvelles applications.

    Dans l'API plus récente, vous avez presque la puissance totale sur la caméra et la documentation de l'appareil Android.

     String[] getCameraIdList() 

    Puis utilisez 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 ceci:

    Les caméras non amovibles utilisent des nombres entiers à partir de 0 pour leurs identifiants, tandis que les caméras amovibles ont un identifiant unique pour chaque périphérique, même si elles sont du même modèle.

    Cependant , cela signifie que si la situation de l'appareil est rare comme une tablette simple de 1-frontière, vous devez compter le nombre de caméras incorporées 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 une méthode uniforme pour identifier la caméra frontale sur tous les appareils Android. Il suffit de dire que le système d'exploitation Android à l'intérieur du périphérique ne peut pas vraiment savoir quelle caméra est exactement là pour certaines raisons: peut-être que le seul identifiant codé en caméra est un nombre entier représentant son importance ou peut-être sur certains périphériques quel que soit le côté que vous tournez sera … " arrière".

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

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


    Pour l'API plus ancienne (ce n'est pas recommandé, car il ne fonctionnera pas sur les téléphones modernes, la version Android plus récente et le transfert est une douleur dans le cul). Utilisez simplement le même Integer CameraID (1) pour ouvrir la caméra frontale comme dans cette réponse :

     cam = Camera.open(1); 

    Si vous avez confiance OpenCV pour faire la partie caméra:

    À l'intérieur

      <org.opencv.android.JavaCameraView ../> 

    Utilisez ce qui suit pour la caméra frontale:

      opencv:camera_id="1" 
     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(); } } 

    Pour API 21 (5.0) et plus tard, vous pouvez utiliser l' API 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. } } } 

    Avec la version 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 de Camera ici .

     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 périphériques plus anciens qui fonctionnent avec Android 4.0 ou plus. Cela peut être utilisé à des fins de test, mais pas recommandé pour le développement principal. Cette solution peut être considérée comme une solution temporaire uniquement. Mais cette solution a aidé beaucoup, donc je n'ai pas l'intention de supprimer cette réponse * /

    Build.gradle

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

    Régler la vue

     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); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.