2010-05-06 3 views
75

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

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

Samsung SHW-M100S имеет две камеры. Если нет ссылки на использование двух камер, любая идея, как Samsung сделал ...?

+0

возможно дубликат [Как использовать Фронтальная камера на Samsung Galaxy S] (http://stackoverflow.com/questions/4241292/how-to-use-front-facing-camera-on-samsung-galaxy-s) – voyager

ответ

10

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

+1

этот статус действителен для Android 2.2? – ozmank

+2

@ozmank: Да, поддержка нескольких камер не была добавлена ​​до Android 2.3. – CommonsWare

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

Хорошая работа на Galaxy S Важный «идентификатор камеры» не «camera_id» – Mahesh

+1

Никогда не предполагайте, что 90 градусов вернут вам правильное вращение для портрета. На разных устройствах это отличается. – colintheshots

2

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

110
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) и до Android версии.

+0

Возможно ли это как-то использовать с технологией «Intent intent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE)», чтобы открыть существующее приложение для камеры? – loeschg

+3

@loeschg 'Intent' обрабатывает действие камеры по-своему. Этот метод используется, когда вы используете 'SurfaceView' для использования функций камеры. – 2013-05-22 03:36:44

+0

вот что я понял. Благодаря! – loeschg

2
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 или старше. Это может использоваться для целей тестирования, но не рекомендуется для основной разработки. Это решение можно рассматривать только как временное решение. Но это решение помогло многим, поэтому я не собираюсь удалять этот ответ. */

+7

Я не думаю, что это документированное использование. open (int id) принимает идентификатор, а не позицию камеры –

+13

, пожалуйста, удалите этот вводящий в заблуждение ответ –

+0

@AlexCohn Не могли бы вы объяснить, почему этот ответ следует удалить. Кажется, что многие из них в порядке с ответом. –

9

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

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

В the newer 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 версии и передача - это боль в заднице). Просто используйте один и тот же Integer CameraID (1), чтобы открыть фронтальную камеру, как в this answer:

cam = Camera.open(1); 

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

Внутри

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

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

 opencv:camera_id="1" 
3

Для API 21 (5.0), а затем вы можете использовать CameraManager API's

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

build.gradle

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

Set Посмотреть

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); 
Смежные вопросы