Android Camera遇到的坑
拍照后onPictureTaken()不能回调
在小米手机3上发现正常运行的程序拍照无法正常回调,且点击拍照按钮后会停留在最后拍照的界面,且日志里不会有任何报错信息。经排查发现是初始化相机的时候设置了setPictureSize()导致的。
奇怪的是系统相机一切正常,且可以用硬件最大分辨率,可是我的代码里只能支持最高为2688x1520的pictureSize,否则均无法收到onPictureTaken回调。
后来发现我的previewSize设置的是系统最高分辨率3840x2160,后来把分辨率改为系统屏幕近似分辨率后,pictureSize可以设置最高分辨率了。
下面给出代码:
/** 预览界面分辨率 */
public static void setPreviewSize(Camera.Parameters parametes) {
List<Camera.Size> localSizes = parametes.getSupportedPreviewSizes();
Camera.Size biggestSize = null;
Camera.Size fitSize = null;// 优先选屏幕分辨率
Camera.Size targetSize = null;// 没有屏幕分辨率就取跟屏幕分辨率相近(大)的size
Camera.Size targetSiz2 = null;// 没有屏幕分辨率就取跟屏幕分辨率相近(小)的size
if(localSizes != null) {
int cameraSizeLength = localSizes.size();
for (int n = 0; n < cameraSizeLength; n++) {
Camera.Size size = localSizes.get(n);
if(biggestSize == null ||
(size.width >= biggestSize.width && size.height >= biggestSize.height)) {
biggestSize = size;
}
if(size.width == DeviceUtils.screenHPixels
&& size.height == DeviceUtils.screenWPixels) {
fitSize = size;
} else if (size.width == DeviceUtils.screenHPixels
|| size.height == DeviceUtils.screenWPixels) {
if(targetSize == null) {
targetSize = size;
} else if (size.width < DeviceUtils.screenHPixels
|| size.height < DeviceUtils.screenWPixels) {
targetSiz2 = size;
}
}
}
if(fitSize == null) {
fitSize = targetSize;
}
if(fitSize == null) {
fitSize = targetSiz2;
}
if(fitSize == null) {
fitSize = biggestSize;
}
parametes.setPreviewSize(fitSize.width, fitSize.height);
}
}
/** 输出的照片为最高像素 */
public static void setPictureSize(Camera.Parameters parametes) {
List<Camera.Size> localSizes = parametes.getSupportedPictureSizes();
Camera.Size biggestSize = null;
Camera.Size fitSize = null;// 优先选预览界面的尺寸
Camera.Size previewSize = parametes.getPreviewSize();
float previewSizeScale = 0;
if(previewSize != null) {
previewSizeScale = previewSize.width / (float) previewSize.height;
}
if(localSizes != null) {
int cameraSizeLength = localSizes.size();
for (int n = 0; n < cameraSizeLength; n++) {
Camera.Size size = localSizes.get(n);
if(biggestSize == null) {
biggestSize = size;
} else if(size.width >= biggestSize.width && size.height >= biggestSize.height) {
biggestSize = size;
}
// 选出与预览界面等比的最高分辨率
if(previewSizeScale > 0
&& size.width >= previewSize.width && size.height >= previewSize.height) {
float sizeScale = size.width / (float) size.height;
if(sizeScale == previewSizeScale) {
if(fitSize == null) {
fitSize = size;
} else if(size.width >= fitSize.width && size.height >= fitSize.height) {
fitSize = size;
}
}
}
}
// 如果没有选出fitSize, 那么最大的Size就是FitSize
if(fitSize == null) {
fitSize = biggestSize;
}
parametes.setPictureSize(fitSize.width, fitSize.height);
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。