it-swarm-pt.tech

Como faço para abrir a "câmera frontal" na plataforma Android?

Mais geralmente, se um dispositivo tiver mais de uma câmera incorporada, Existe uma maneira de inicializar uma delas em particular?

Não encontrei na documentação de referência do Android:

Samsung SHW-M100S tem duas câmeras. Se não há referência para usar duas câmeras, alguma idéia de como a Samsung fez ...?

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

Adicione as seguintes permissões no arquivo 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: Este recurso está disponível em Gingerbread (2.3) e Up Android Version.

113
user456118

Todos os métodos das respostas mais antigas foram descontinuados pelo Google (supostamente por causa de problemas como este), já que a API 21 precisa use a API da Camera 2:

Esta classe foi preterida no nível 21 da API. Recomendamos o uso da nova API Android.hardware.camera2 para novos aplicativos.

Em a API mais recente você tem energia quase completa sobre a câmera do dispositivo Android e documentação explicitamente conselhos para

String[] getCameraIdList()

e use o CameraId obtido para abrir a câmera:

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

99% das câmeras frontais têm id = "1" e a câmera traseira id = "0" De acordo com isso:

As câmeras não removíveis usam números inteiros a partir de 0 para seus identificadores , Enquanto câmeras removíveis têm um identificador exclusivo para cada dispositivo individual , Mesmo que sejam do mesmo modelo.

No entanto, isso significa que se a situação do dispositivo é rara como apenas 1-frontal-câmera, você precisa contar quantas embedded câmeras você tem, e colocar a ordem da câmera por sua importância ("0"). Então CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, o que implica que a câmera traseira é mais importante que frontal.

Eu não sei sobre um método uniformepara identificar a câmera frontal em todos os dispositivos Android. Simplesmente dito, o sistema operacional Android dentro do dispositivo não pode realmente descobrir qual câmera está exatamente onde por alguns motivos: talvez a única câmera com código embutido seja um número inteiro representando sua importância ou talvez em alguns dispositivos, qualquer que seja o lado que você rodar. de volta".

Documentation: https://developer.Android.com/reference/Android/hardware/camera2/package-summary.html

Exemplos explícitos: https://github.com/googlesamples/Android-Camera2Basic


Para a API mais antiga (isso não é recomendado, porque não funcionará em telefones modernos, a versão mais recente do Android e a transferência é uma tarefa difícil). Basta usar o mesmo Integer CameraID (1) para abrir a câmera frontal como em esta resposta :

cam = Camera.open(1);

Se você confia em OpenCV para fazer a parte da câmera:

Dentro

    <org.opencv.Android.JavaCameraView
    ../>

use o seguinte para a câmera frontal:

        opencv:camera_id="1"
11
iantonuk

A partir do Android 2.1, o Android suporta apenas uma única câmera em seu SDK. É provável que isso seja adicionado em uma versão futura do Android. 

10
CommonsWare
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();
    }
}
4
Mahesh

Para API 21 (5.0) e posterior, você pode usar as APIs CameraManager

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.
        }
    }
}
4
Airsource Ltd

Com o lançamento do Android 2.3 (Gingerbread), agora você pode usar a classe Android.hardware.Camera para obter o número de câmeras, informações sobre uma câmera específica e obter uma referência a uma Camera específica. Confira as novas APIs Cameraaqui .

2
Wesley Wiser

build.gradle

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

Definir modo de exibição

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

/ * Esta não é a maneira correta, esta é uma solução para dispositivos mais antigos que executam o Android 4.0 ou mais antigo. Isso pode ser usado para fins de teste, mas não é recomendado para o desenvolvimento principal. Esta solução pode ser considerada apenas como uma solução temporária. Mas essa solução ajudou muitos, então não pretendo excluir essa resposta * / 

0
Amalan Dhananjayan