Я боролся с той же проблемой в своем собственном проекте камеры на своем HTC Desire S. Несмотря на то что метод getSupportedPictureSizes вернул огромный список поддерживаемых размеров, я обнаружил, что снимки, которые я смог сделать без «вертикальной черты» проблема заключалась в тех, которые имели соотношение сторон, наиболее близко соответствующее соотношению сторон экрана устройства.
Пример:
Мой HTC Desire S возвращает следующий список при вызове метода getSupportedPictureSizes:
2592x1952,2592x1456,2592x1520,2592x1936,2592x1728,2592x1552,2048x1536,2048x1360,2048x1216,2048x1152,2048x1200,1600x1200,1584x1056,1280x960,1280x848,1280x768,1280x720,1280x752,1024x768,640x480,640x416,640x384,640x368,512x384,400x400,272x272
Разрешение экрана телефона:
800x480
Aspect Ratio: 1.67
Так что, если я использую наибольший размер, возвращаемый методом getSupportedPictureSizes, для захвата изображения
2592x1952
Aspect Ratio: 1.32
Результат: захваченное изображение представляет собой серию вертикальных полос. (
Поэтому я изменил метод getOptimalPreviewSize, как указано здесь в примере CameraPreview , чтобы получить список разрешений, наиболее близких к разрешению экрана handet. Не самый эффективный способ сделать это, но у меня работает:
private List getOptimalPictureSizes(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
List<Size> finalSizes = new ArrayList();
// First filter out all sizes that have an aspect
// tolerance > 0.1
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) < ASPECT_TOLERANCE){
finalSizes.add(size);
}
}
// Remove sizes with same width but more deviation from the
// handset's aspect ratio (1.67 in my HTC Desire S)
List<Size> absoulteSizes = new ArrayList<Size>();
for(int i=0; i<finalSizes.size()-1; i++){
for(int j=i+1; j<finalSizes.size(); j++){
Size iSize = finalSizes.get(i);
Size jSize = finalSizes.get(j);
if(iSize.width != jSize.width)
continue;
double iRatio = (double)iSize.width/iSize.height;
double jRatio = (double)jSize.width/jSize.height;
if(Math.abs(targetRatio - iRatio) < Math.abs(targetRatio - jRatio)){
absoulteSizes.add(iSize);
}else if(Math.abs(targetRatio - iRatio) > Math.abs(targetRatio - jRatio)){
absoulteSizes.add(jSize);
}
else{
absoulteSizes.add(iSize);
absoulteSizes.add(jSize);
}
}
}
for(Size s:absoulteSizes){
Log.e("Preview", "COMPUTED::: "+s.width+"x"+s.height);
}
return absoulteSizes;
}
Приведенный выше метод дает мне следующий отфильтрованный список:
2592x1552 Aspect Ratio: 1.67
2048x1216 Aspect Ratio: 1.684
1280x768 Aspect Ratio: 1.67
640x384 Aspect Ratio: 1.67
Все 4 размера работают нормально для моей камеры без проблем с вертикальной чертой. Также стоит отметить, что те же 4 размера предлагаются и в приложении к стандартной камере телефона.
Надеюсь, это поможет.