La calidad de la vista previa de la cámara en Android es mala

Estoy haciendo una aplicación de cámara en Android y he usado la siguiente función para obtener el tamaño de vista previa:

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio = (double) w / h;
    if (sizes == null) return null;

    Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    // Try to find an size match aspect ratio and size
    for (Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    // Cannot find the one match the aspect ratio, ignore the requirement
    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}

Y configuro el tamaño de esta manera:

Size s = getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), w, h);
parameters.setPreviewSize(s.width, s.height);

Pero el problema es que cuando ejecuto mi aplicación, la calidad de la vista previa de la cámara es realmente mala. ¿Cómo obtengo la misma calidad de vista previa que obtengo cuando ejecuto mi aplicación de cámara predeterminada en mi teléfono? En otras palabras, quiero una vista previa de alta resolución de la cámara en mi aplicación.

Incluso no estoy seguro de si el tamaño de la vista previa es la causa de este problema.

NOTA: La función para obtener el tamaño de la vista previa se toma de los programas de ejemplo de Android Docs.

Respuestas a la pregunta(1)

Su respuesta a la pregunta