web-dev-qa-db-fra.com

Comment définir l'aperçu et la taille de la caméra Android2?

J'utilise une SurfaceView pour afficher l'aperçu que je capture. Je veux utiliser width = 1080, height = 1920 pour l'aperçu. Où puis-je définir la taille de l'aperçu?

J'ai googlé pour une réponse, mais ils sont tous pour la version 1 de l'appareil photo. J'utilise Android.hardware.camera2.

private void takePreview() {
    try {
        final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());
        mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() // ③
        {
            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                if (null == mCameraDevice) return;
                mCameraCaptureSession = cameraCaptureSession;
                try {
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                    previewRequestBuilder.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, new Size(1080,1920));

                    CaptureRequest previewRequest = previewRequestBuilder.build();
                    mCameraCaptureSession.setRepeatingRequest(previewRequest, null, childHandler);
                } catch (CameraAccessException e) {
                    Log.e("takePreview","onConfigured(CameraCaptureSession cameraCaptureSession)",e);
                }
            }
            @Override
            public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                Log.e("takePreview","onConfigureFailed");
            }
        }, childHandler);
    } catch (CameraAccessException e) {
        Log.e("takePreview","CameraAccessException");
    }
}
5
John Zhang

Comme indiqué dans la référence à createCaptureSession :

Pour dessiner sur un SurfaceView: Une fois la surface de SurfaceView créée, définissez la taille de la surface avec setFixedSize (int, int) afin qu’elle soit l’une des tailles renvoyées par getOutputSizes (SurfaceHolder.class ), puis obtenir la surface en appelant getSurface () . Si la taille n'est pas définie par l'application, elle sera arrondie à la taille prise en charge la plus proche, inférieure à 1080p, par l'appareil photo.

5
Eddy Talvala

Jetez un coup d'œil à l'exemple Camera2Basic fourni par Google sur GitHub: https://github.com/googlesamples/Android-Camera2Basic

Il existe une méthode dans le fragment principal qui choisit la taille de prévisualisation facultative pour un périphérique donné. Cela peut être une meilleure approche si vous voulez rendre votre application plus flexible, plutôt que de coder en dur la taille, mais même si vous préférez rester avec des tailles définies, vous pouvez voir comment elles utilisent les résultats.

En résumé, il vous suffit de définir la taille de TextureView, dans leur cas, sur la taille de la prévisualisation souhaitée.

Le nom de la méthode est 'ChooseOptimalSize' et inclut ce commentaire/cette explication: 

/**
     * Given {@code choices} of {@code Size}s supported by a camera, choose the smallest one that
     * is at least as large as the respective texture view size, and that is at most as large as the
     * respective max size, and whose aspect ratio matches with the specified value. If such size
     * doesn't exist, choose the largest one that is at most as large as the respective max size,
     * and whose aspect ratio matches with the specified value.
     *
     * @param choices           The list of sizes that the camera supports for the intended output
     *                          class
     * @param textureViewWidth  The width of the texture view relative to sensor coordinate
     * @param textureViewHeight The height of the texture view relative to sensor coordinate
     * @param maxWidth          The maximum width that can be chosen
     * @param maxHeight         The maximum height that can be chosen
     * @param aspectRatio       The aspect ratio
     * @return The optimal {@code Size}, or an arbitrary one if none were big enough
     */
1
Mick