Ответ 1
Вкратце, вы можете сделать предварительный просмотр камеры в полноэкранном режиме, однако вам нужно будет найти подходящие размеры среди поддерживаемых размеров предварительного просмотра самостоятельно, только если пользовательский предварительный просмотр камеры - это то, что вы хотите.
По вашему вопросу, согласно Android Developers - Camera
Если вы хотите установить определенный размер для предварительного просмотра камеры, установите это в методе
surfaceChanged()
, как указано в комментариях выше. когда установите размер предварительного просмотра, должен использовать значения изgetSupportedPreviewSizes()
. Не устанавливайте произвольные значения вsetPreviewSize()
метод.
Казалось, вы не можете вручную передать размер, который хотите, кроме размеров, предоставляемых getSupportedPreviewSizes()
. При более близком рассмотрении размеров, поддерживаемых вашей камерой телефона, вы обнаружите, что соотношение поддерживаемых размеров может не соответствовать точному соотношению экранов.
Например, Samsung Galaxy Ace II имеет экран разрешения 480x800, читая Size
, возвращенный с getSupportedPreviewSizes()
, его камера поддерживает:
2560x1920
2560x1536
2048x1536
2048x1232
960x720
640х480
и если вы хотите правильно отобразить предварительный просмотр камеры в полноэкранном режиме (без растягивания), вам нужно будет рассчитать, сравнить и применить подходящее соотношение в этих поддерживаемых размерах предварительного просмотра.
Реализация поиска правильного размера предварительного просмотра не является чем-то сложным. Общим методом для этого было бы что-то вроде этого:
/**
* Calculate the optimal size of camera preview
* @param sizes
* @param w
* @param h
* @return
*/
private Size getOptimalSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.2;
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)
{
// Log.d("CameraActivity", "Checking size " + size.width + "w " + size.height + "h");
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);
}
}
}
SharedPreferences previewSizePref;
if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
previewSizePref = getSharedPreferences("PREVIEW_PREF",MODE_PRIVATE);
} else {
previewSizePref = getSharedPreferences("FRONT_PREVIEW_PREF",MODE_PRIVATE);
}
SharedPreferences.Editor prefEditor = previewSizePref.edit();
prefEditor.putInt("width", optimalSize.width);
prefEditor.putInt("height", optimalSize.height);
prefEditor.commit();
// Log.d("CameraActivity", "Using size: " + optimalSize.width + "w " + optimalSize.height + "h");
return optimalSize;
}
И вы также можете сделать аналогичный поиск подходящих размеров камеры (размер выходного изображения).
Примечание. Я нашел исходную версию вышеуказанного кода из Интернета, и я сделал некоторые изменения/оптимизации для своей собственной цели.
Пожалуйста, дайте мне знать, если это сработает для вас.