Wie öffne ich die „Frontkamera“ auf der Android-Plattform?


82

Gibt es im Allgemeinen eine Möglichkeit, eine bestimmte Kamera zu initialisieren, wenn ein Gerät über mehr als eine eingebettete Kamera verfügt?

Ich habe es in der Android-Referenzdokumentation nicht gefunden:

Samsung SHW-M100S verfügt über zwei Kameras. Wenn es keinen Hinweis auf die Verwendung von zwei Kameras gibt, eine Idee, wie Samsung es gemacht hat ...?


Mögliches Duplikat der Verwendung der
Frontkamera

Antworten:


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

Fügen Sie der AndroidManifest.xmlDatei die folgenden Berechtigungen hinzu :

<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" />

Hinweis: Diese Funktion ist in Gingerbread (2.3) und der Up Android-Version verfügbar.


Ist es möglich, dies irgendwie mit der Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);Technik zu verwenden, um die vorhandene Kamera-App zu öffnen?
Loeschg

3
@loeschg Intentbehandelt Kameraaktionen auf seine eigene Weise. Diese Technik wird verwendet, wenn Sie SurfaceViewdie Kamerafunktionalität nutzen.

das habe ich mir gedacht. Vielen Dank!
Loeschg

2
Sehr cooler Beitrag. Ich habe eine Weile gebraucht, um herauszufinden, dass die Ausrichtung der Kamera nicht unbedingt mit dem Kameraindex übereinstimmt. Zum Beispiel hat mein Tablet nur eine Kamera (Index: 0), aber nach vorne gerichtet (Index: 1). Daher ist die Verwendung des einfachen Codes wie Camera.open (CameraInfo.CAMERA_FACING_FRONT) nicht sinnvoll.
Matthias

@ Matthias Stimme dir zu, Kumpel. Da wir verschiedene OEMs haben, wird unsere Programmiertechnik entsprechend unseren Anforderungen geändert. Vielen Dank für die Hervorhebung.

14

Alle Methoden ältere Antworten werden von Google als veraltet (angeblich wegen Beschwerden wie diese), da API 21 Sie müssen verwenden die Kamera 2 API:

Diese Klasse wurde in API-Level 21 nicht mehr unterstützt. Wir empfehlen, die neue API android.hardware.camera2 für neue Anwendungen zu verwenden.

In der neueren API haben Sie fast die volle Macht über die Android-Gerätekamera und Dokumentation ausdrücklich empfohlen

String[] getCameraIdList()

und öffnen Sie die Kamera mit der erhaltenen CameraId:

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

99% der frontalen Kameras hat id = „1“, und die Rückseite der Kamera - ID = „0“ nach dieser:

Nicht entfernbare Kameras verwenden Ganzzahlen ab 0 für ihre Kennungen, während entfernbare Kameras für jedes einzelne Gerät eine eindeutige Kennung haben, selbst wenn sie dasselbe Modell sind.

Dies bedeutet jedoch , dass Sie , wenn eine Gerätesituation selten ist, wie z. B. ein Tablet mit 1 Frontalkamera, die Anzahl der eingebetteten Kameras zählen und die Reihenfolge der Kamera nach ihrer Wichtigkeit ("0") festlegen müssen . Also CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, was bedeutet, dass die Rückkamera wichtiger ist als die Frontkamera .

Ich kenne keine einheitliche Methode zur Identifizierung der Frontkamera auf allen Android-Geräten. Einfach gesagt, das Android-Betriebssystem im Gerät kann aus bestimmten Gründen nicht wirklich herausfinden, welche Kamera genau wo ist: Vielleicht ist die einzige fest codierte Kamera-ID eine Ganzzahl, die ihre Bedeutung darstellt, oder auf einigen Geräten, egal auf welcher Seite Sie sich befinden. " zurück".

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

Explizite Beispiele : https://github.com/googlesamples/android-Camera2Basic


Für die ältere API (es wird nicht empfohlen, da es auf modernen Handys nicht funktioniert, neuere Android-Version und Übertragung ist ein Schmerz im Arsch). Verwenden Sie einfach dieselbe Integer CameraID (1), um die Frontkamera wie in dieser Antwort zu öffnen :

cam = Camera.open(1);

Wenn Sie darauf vertrauen, dass OpenCV den Kamerateil übernimmt:

Innerhalb

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

Verwenden Sie für die Frontkamera Folgendes:

        opencv:camera_id="1"

10

Ab Android 2.1 unterstützt Android nur eine einzige Kamera in seinem SDK. Es ist wahrscheinlich, dass dies in einer zukünftigen Android-Version hinzugefügt wird.


1
Diese Aussage gilt auch für Android 2.2?
Ozmank

2
@ozmank: Ja, die Unterstützung mehrerer Kameras wurde erst mit Android 2.3 hinzugefügt.
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
Gute Arbeit an Galaxy S Wichtig "Kamera-ID" nicht "camera_id"
Mahesh

3
Gehen Sie niemals davon aus, dass Sie mit 90 Grad die richtige Drehung für das Porträt erhalten. Bei vielen Geräten ist das anders.
Colintheshots

4

Für API 21 (5.0) und höher können Sie die CameraManager-APIs verwenden

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

3

Zum Öffnen der Rückseite der Kamera: -

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

Zum Öffnen der Frontkamera: -

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
when {
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT)  // Tested on API 24 Android version 7.0(Samsung S6)
     }
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT) // Tested on API 27 Android version 8.0(Nexus 6P)
         cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true)
     }
     else -> cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", 1)  // Tested API 21 Android version 5.0.1(Samsung S4)
}
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

Ich konnte es für API 28 und höher nicht zum Laufen bringen. Außerdem ist das direkte Öffnen der Frontkamera bei einigen Geräten nicht möglich (abhängig vom Hersteller).


2

Mit der Veröffentlichung von Android 2.3 (Gingerbread) können Sie die android.hardware.CameraKlasse jetzt verwenden , um die Anzahl der Kameras, Informationen zu einer bestimmten Kamera und einen Verweis auf eine bestimmte Kamera abzurufen Camera. Schauen Sie sich hier die neuen CameraAPIs an .


1

build.gradle

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

Ansicht einstellen

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

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

/ * Dies ist nicht der richtige Weg. Dies ist eine Lösung für ältere Geräte, auf denen Android 4.0 oder älter ausgeführt wird. Dies kann zu Testzwecken verwendet werden, wird jedoch für die Hauptentwicklung nicht empfohlen. Diese Lösung kann nur als vorübergehende Lösung betrachtet werden. Aber diese Lösung hat vielen geholfen, deshalb beabsichtige ich nicht, diese Antwort zu löschen * /


7
Ich glaube nicht, dass es sich um eine dokumentierte Verwendung handelt. open (int id) akzeptiert die ID, nicht die Kameraposition
XY

13
Bitte entfernen Sie diese irreführende Antwort
Alex Cohn

13
@AmalanDhananjayan: Siehe zum Beispiel den Kommentar von @Matthias oben : … Ich habe eine Weile
Alex Cohn

5
Das ist Balderdash. Versuchen Sie nicht einmal, dies zu verwenden.
Adam

4
Das ist schrecklich. Mach das NIEMALS. Diese Antwort sollte verboten werden. Camera.open () akzeptiert eine Kamera-ID, nicht den Ordnungswert der Kamera! Dies schlägt bei einer bedeutenden Minderheit von Geräten fehl und funktioniert nur durch bloßes Pech.
Colintheshots
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.