2010-05-06 8 views
75

Più in generale, se un dispositivo ha più di una telecamera incorporata, c'è un modo per inizializzarne uno in particolare?Come si apre la "fotocamera frontale" sulla piattaforma Android?

non ho trovato nella documentazione di riferimento Android:

Samsung SHW-M100S è dotato di due fotocamere. Se non ci sono riferimenti per usare due fotocamere, qualche idea su come Samsung ha fatto ...?

+0

possibile duplicato di [Come usare fotocamera frontale su Samsung Galaxy S] (http://stackoverflow.com/questions/4241292/how-to-use-front-facing-camera-on-samsung-galaxy-s) – voyager

risposta

10

A partire da Android 2.1, Android supporta solo una singola videocamera nel suo SDK. È probabile che questo verrà aggiunto in una futura versione di Android.

+1

questo articolo è valido anche per Android 2.2? – ozmank

+2

@ozmank: Sì, il supporto per più videocamere non è stato aggiunto prima di 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

Buon lavoro su Galaxy S Importante "cameraid" non "camera_id" – Mahesh

+1

Non assumere mai 90 gradi per ottenere la rotazione corretta per il ritratto. È diverso su molti dispositivi. – colintheshots

2

Con il rilascio di Android 2.3 (pan di zenzero), è ora possibile utilizzare la classe android.hardware.Camera per ottenere il numero di telecamere, informazioni su una specifica telecamera, e ottenere un riferimento ad uno specifico Camera. Consulta le nuove API Camerahere.

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

Aggiungere le seguenti autorizzazioni nel file 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: Questa funzione è disponibile a Gingerbread (2.3) e Up Versione Android.

+0

È possibile utilizzare questo in qualche modo con la tecnica Intent intent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE); 'per aprire l'app fotocamera esistente? – loeschg

+3

@loeschg 'Intent' gestisce l'azione della fotocamera a modo suo. Questa tecnica viene utilizzata quando si utilizza 'SurfaceView' per sfruttare le funzionalità della fotocamera. –

+0

questo è quello che ho capito. Grazie! – 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(); 
} 

/* Questo non è il modo corretto, questa è una soluzione per dispositivi precedenti che eseguono Android 4.0 o precedenti. Questo può essere usato a scopo di test, ma non è raccomandato per lo sviluppo principale. Questa soluzione può essere considerata solo una soluzione temporanea. Ma questa soluzione ha aiutato molti quindi non intendo cancellare questa risposta */

+7

Non penso che sia un uso documentato. open (int id) accetta l'id, non la posizione della telecamera –

+13

rimuovi questa risposta ingannevole –

+0

@AlexCohn Puoi spiegare perché questa risposta dovrebbe essere rimossa. Sembra che molti di loro stiano bene con la risposta. –

9

Tutti i metodi delle risposte precedenti sono deprecati da Google (presumibilmente a causa di problemi come questo), poiché l'API 21 è necessario use la Camera 2 API:

Questa classe è stata dichiarata obsoleta in livello API 21. Si consiglia di utilizzare la nuova API android.hardware.camera2 per nuove applicazioni.

In the newer API avete quasi completo potere sopra la fotocamera del dispositivo Android e la documentazione in modo esplicito consiglio per

String[] getCameraIdList() 

e quindi utilizzare CameraId ottenuto per aprire la fotocamera:

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

Il 99% delle telecamere frontali ha id = "1" e la telecamera posteriore id = "0" secondo questa:

telecamere non removibile uso interi iniziando a 0 per i loro identificatori , mentre le telecamere rimovibili hanno un identificatore unico per ciascun singolo dispositivo, anche se sono dello stesso modello.

Tuttavia, questo significa che se la situazione dispositivo è rara come tablet -Camera solo 1-frontale è necessario contare quanti incorporati telecamere che hai, e l'ordine della telecamera per la sua importanza (" 0"). Quindi CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, il che implica che la fotocamera posteriore è più importante piuttosto che frontale.

Non conosco un metodo uniforme per identificare la fotocamera frontale su tutti i dispositivi Android. Detto semplicemente, il sistema operativo Android all'interno del dispositivo non è in grado di scoprire quale telecamera è esattamente dove, per qualche motivo: forse l'unico ID hardcoded della fotocamera è un numero intero che rappresenta la sua importanza o forse su alcuni dispositivi qualunque sarà il tuo turno. " indietro".

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

esempi espliciti: https://github.com/googlesamples/android-Camera2Basic


per l'API vecchio (non è consigliabile, perché non funziona su telefoni moderni versione più recente di Android e il trasferimento è un vero rompicapo). Basta usare lo stesso Integer CameraID (1) per aprire fotocamera frontale come in this answer:

cam = Camera.open(1); 

Se vi fidate OpenCV a fare la parte della macchina fotografica:

All'interno

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

utilizzare quanto segue per la fotocamera frontale:

 opencv:camera_id="1" 
3

Per API 21 (5.0) e successivamente è possibile utilizzare il build.gradle 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

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

Set View

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