Как открыть «переднюю камеру» на платформе Android?

В более общем плане, если устройство имеет более одной встроенной камеры, есть ли способ инициализировать один из них в частности?

Я не нашел его в справочной документации Android:

  • 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 имеет две камеры. Если нет ссылки на использование двух камер, любая идея, как Samsung сделал …?

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

Добавьте в файл 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" /> 

Примечание. Эта функция доступна в Gingerbread (2.3) и Up Android Version.

Начиная с Android 2.1, Android поддерживает только одну камеру в SDK. Вполне вероятно, что это будет добавлено в будущую версию Android.

Все методы более старых ответов устарели Google (предположительно из-за таких неприятностей), поскольку API 21 вам необходимо использовать API Camera 2:

Этот класс устарел на уровне API 21. Мы рекомендуем использовать новый API android.hardware.camera2 для новых приложений.

В новом API у вас почти полная власть над камерой устройства Android и документации, в которой

 String[] getCameraIdList() 

А затем использовать полученный CameraId для открытия камеры:

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

99% лобовых камер имеют id = «1», а задняя камера id = «0» в соответствии с этим:

В несъемных камерах используются целые числа, начинающиеся с 0 для их идентификаторов, в то время как съемные камеры имеют уникальный идентификатор для каждого отдельного устройства, даже если они являются одной и той же моделью.

Однако это означает, что если ситуация с устройством редка, как только 1-фронтальная таблетка, вам нужно подсчитать, сколько встроенных камер у вас есть, и поместите порядок камеры по ее значению («0»). Итак, CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, что означает, что задняя камера важнее фронтальной.

Я не знаю о едином методе идентификации лобовой камеры на всех устройствах Android. Проще говоря, ОС Android внутри устройства не может действительно узнать, какая камера именно там по некоторым причинам: может быть, единственный идентификатор жесткого диска камеры – это целое число, представляющее его важность, или, может быть, на некоторых устройствах, какая бы сторона вас ни поворачивала … » назад».

Документация : https://developer.android.com/reference/android/hardware/camera2/package-summary.html

Явные примеры : https://github.com/googlesamples/android-Camera2Basic


Для более старого API (это не рекомендуется, потому что он не будет работать на современных телефонах, более новая версия Android и передача – боль в заднице). Просто используйте тот же Целочисленный CameraID (1), чтобы открыть фронтальную камеру, как в этом ответе :

 cam = Camera.open(1); 

Если вы доверяете OpenCV для части камеры:

внутри

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

Для лобовой камеры используйте следующее:

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

Для API 21 (5.0) и более поздних версий вы можете использовать API CameraManager API

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

С выпуском Android 2.3 (Gingerbread) теперь вы можете использовать класс android.hardware.Camera для получения количества камер, информации о конкретной камере и получения ссылки на конкретную Camera . Ознакомьтесь с новыми API-интерфейсами Camera здесь .

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

/ * Это не правильно, это решение для более старых устройств, работающих под управлением Android 4.0 или старше. Это может использоваться для целей тестирования, но не рекомендуется для основной разработки. Это решение можно рассматривать только как временное решение. Но это решение помогло многим, поэтому я не собираюсь удалять этот ответ * /

build.gradle

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

Установить вид

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