2010-05-06 116 views
75

更一般地說,如果一個設備有多個嵌入式相機, 有沒有特別的方法來初始化其中之一?如何在Android平臺上打開「前置攝像頭」?

我沒有Android的參考文檔中找到它:

三星SHW-M100S有兩個攝像頭。如果沒有提及使用兩臺攝像機,那麼三星是如何做的?

+0

可能重複[如何使用Front三星置攝像頭Galaxy S](http://stackoverflow.com/questions/4241292/how-to-use-front-facing-camera-on-samsung-galaxy-s) – voyager 2010-12-28 00:07:21

回答

10

從Android 2.1開始,Android只支持SDK中的單個攝像頭。這很可能會在未來的Android版本中添加。

+1

此聲明適用於Android 2.2嗎? – ozmank 2012-02-13 07:40:00

+2

@ozmank:是的,在Android 2.3之前不會添加多攝像頭支持。 – CommonsWare 2012-02-13 12:17:15

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的良好工作重要的「相機ID」不是「camera_id」 – Mahesh 2010-11-10 14:37:35

+1

永遠不要假設90度會讓你正確旋轉肖像。在許多設備上它是不同的。 – colintheshots 2016-03-23 16:50:48

2

隨着Android 2.3釋放(薑餅),你現在可以使用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" /> 

注:此功能在薑餅(2.3)和Android的最高版本。

+0

是否有可能以'Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)'技術以某種方式使用此技術來打開現有的相機應用程序? – loeschg 2013-05-21 20:00:48

+3

@loeschg'意圖'以自己的方式處理相機動作。當您使用「SurfaceView」來利用相機功能時,會使用此技術。 – 2013-05-22 03:36:44

+0

這就是我的想法。謝謝! – loeschg 2013-05-22 15:03:41

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

我不認爲這是記錄的使用情況。打開(INT ID)接受ID,而不是相機位置 – 2014-01-20 02:38:37

+13

請刪除這個誤導性的答案 – 2014-03-05 07:40:43

+0

@AlexCohn你能解釋爲什麼這個答案應該被刪除。看起來他們中的許多人對答案都沒有問題。 – 2014-03-05 07:50:21

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-正面-camera平板電腦就需要數多少嵌入式相機你有,並通過它的重要性將相機的順序(」 0" )。因此,CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0,這意味着後置攝像頭比正面更重要重要

我不知道制服確定所有Android設備上的正面相機的方法。簡而言之,設備內部的Android操作系統無法真正發現哪個相機正是由於某些原因而存在的地方:也許唯一的相機硬編碼ID是一個代表其重要性的整數,或者可能在某些設備上,無論您轉向哪一方。「背部」。

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

明確例子https://github.com/googlesamples/android-Camera2Basic


對於老年API(不推薦,因爲它不會在現代的手機上運行新的Android版本,轉移是一個痛苦的屁股)。只要使用相同的整數 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+' 
    } 

設置視圖

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); 
相關問題