У меня была такая же проблема, и это было связано с соотношением сторон моего превью. Я реализовал следующий код, чтобы вернуть мне правильный размер предварительного просмотра для моего устройства. Я обнаружил, что проблема заключалась в значении, которое я передавал соотношению сторон (я передавал размер предварительного просмотра), и на некоторых устройствах камера разбивалась при попытке открыть. Я получал исключение CameraError (3) о сломанной трубе.
private static Size ChooseOptimalSize(Size[] choices, int textureViewWidth, int textureViewHeight,
int maxWidth, int maxHeight)
{
var bigEnough = new List<Size>();
var notBigEnough = new List<Size>();
//Test different aspect ratios(4:3, 16:9)
int w = 4;
int h = 3;
foreach(Size option in choices)
{
if(option.Width <= maxWidth && option.Height <= maxHeight)
{
if(option.Height == option.Width * h / w)
{
if (option.Width >= textureViewWidth && option.Height >= textureViewHeight)
{
bigEnough.Add(option);
}
else
notBigEnough.Add(option);
}
}
}
if (bigEnough.Count > 0)
return (Size)Collections.Min(bigEnough, new ComparesSizeByArea());
else if (notBigEnough.Count > 0)
return (Size)Collections.Max(notBigEnough, new ComparesSizeByArea());
else
{
return choices[0];
}
}
ComparesSizesByArea - это вспомогательный класс со следующим методом:
public int Compare(Java.Lang.Object lhs, Java.Lang.Object rhs)
{
var lhsSize = (Size)lhs;
var rhsSize = (Size)rhs;
return Long.Signum((long)lhsSize.Width * lhsSize.Height - (long)rhsSize.Width * rhsSize.Height);
}
В расширенном textureView также ограничьте его шириной:
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.GetSize(widthMeasureSpec);
int height = MeasureSpec.GetSize(heightMeasureSpec);
if (ratioWidth == 0 || ratioHeight == 0)
SetMeasuredDimension(width, height);
else
{
if (width > (float)height * ratioWidth / ratioHeight)
SetMeasuredDimension(width, width * ratioHeight / ratioWidth);
else
SetMeasuredDimension(height * ratioWidth / ratioHeight, height);
}
}