professional for dual best apps app android camera android-camera

for - best video camera app android 2018



¿Cómo abro la "cámara frontal" en la plataforma Android? (8)

En términos más generales, si un dispositivo tiene más de una cámara integrada, ¿hay alguna manera de inicializar una de ellas en particular?

No lo encontré en la documentación de referencia de Android:

Samsung SHW-M100S tiene dos cámaras. Si no hay referencia para usar dos cámaras, ¿alguna idea de cómo lo hizo Samsung ...?


A partir de Android 2.1, Android solo admite una sola cámara en su SDK. Es probable que esto se agregue en una futura versión de Android.


Con el lanzamiento de Android 2.3 (Gingerbread), ahora puede usar la clase android.hardware.Camera para obtener el número de cámaras, información sobre una cámara específica y obtener una referencia a una Camera específica. Consulte las nuevas API de la Camera here .


Para API 21 (5.0) y posterior, puede usar la https://developer.android.com/reference/android/hardware/camera2/CameraManager.html

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


Todos los métodos de las respuestas anteriores son obsoletos por Google (supuestamente debido a problemas como este), ya que la API 21 necesita https://developer.android.com/reference/android/hardware/Camera.html la API de la Cámara 2:

Esta clase quedó obsoleta en el nivel de API 21. Recomendamos usar la nueva API android.hardware.camera2 para nuevas aplicaciones.

En https://developer.android.com/reference/android/hardware/camera2/CameraManager.html , tienes casi todo el poder sobre la cámara del dispositivo Android y la documentación explícitamente consejos para

String[] getCameraIdList()

y luego usa CameraId obtenido para abrir la cámara:

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

El 99% de las cámaras frontales tienen id = "1", y la cámara trasera id = "0" de acuerdo con esto:

Las cámaras no extraíbles usan números enteros que comienzan en 0 para sus identificadores, mientras que las cámaras extraíbles tienen un identificador único para cada dispositivo individual, incluso si son del mismo modelo.

Sin embargo , esto significa que si la situación del dispositivo es rara, como la tableta de 1 cámara frontal, debe contar cuántas cámaras integradas tiene y realizar el orden de la cámara por su importancia ("0"). Entonces CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, lo que implica que la cámara trasera es más importante que frontal.

No sé sobre un método uniforme para identificar la cámara frontal en todos los dispositivos Android. Simplemente dicho, el sistema operativo Android dentro del dispositivo realmente no puede averiguar qué cámara es exactamente la que por alguna razón: tal vez la única cámara con una identificación codificada es un entero que representa su importancia o tal vez en algunos dispositivos, sea cual sea el lado que gire ... " espalda".

Documentación : https://developer.android.com/reference/android/hardware/camera2/package-summary.html

Ejemplos explícitos : https://github.com/googlesamples/android-Camera2Basic

Para la API anterior (no se recomienda, porque no funcionará en los teléfonos modernos, la versión más nueva de Android y la transferencia son una molestia en el culo). Simplemente use el mismo Integer CameraID (1) para abrir la cámara frontal como en esta respuesta :

cam = Camera.open(1);

Si confías en OpenCV para hacer la parte de la cámara:

Dentro

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

usa lo siguiente para la cámara frontal:

opencv:camera_id="1"


build.gradle

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

Establecer vista

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


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

/ * Esta no es la manera correcta, esta es una solución para dispositivos antiguos que ejecutan Android 4.0 o versiones anteriores. Esto se puede utilizar con fines de prueba, pero no se recomienda para el desarrollo principal. Esta solución puede considerarse solo como una solución temporal. Pero esta solución ha ayudado a muchos, así que no tengo la intención de eliminar esta respuesta * /


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

Agregue los siguientes permisos en el archivo 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" />

Nota: Esta función está disponible en Gingerbread (2.3) y en la versión de Android.


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