Android三星Galaxy S4定制相机预览失真
我在使用target sdk 22构建的应用程序中使用自定义摄像头。我已经通过我的应用程序在很多设备上测试了摄像头,包括三星S5、三星Note 4和华为ascend mate 7,图像预览很好 但当我在三星Galaxy S4(安卓5.0.1)上通过应用程序打开相机时,我的相机预览失真了。以下是预览的图像: 我在stackoverflow上看到过很多帖子,但它们都是在抓拍图片之后发布的,我的问题是在抓拍图片之前发布的 以下是我用于预览的代码:Android三星Galaxy S4定制相机预览失真,android,camera,samsung-mobile,Android,Camera,Samsung Mobile,我在使用target sdk 22构建的应用程序中使用自定义摄像头。我已经通过我的应用程序在很多设备上测试了摄像头,包括三星S5、三星Note 4和华为ascend mate 7,图像预览很好 但当我在三星Galaxy S4(安卓5.0.1)上通过应用程序打开相机时,我的相机预览失真了。以下是预览的图像: 我在stackoverflow上看到过很多帖子,但它们都是在抓拍图片之后发布的,我的问题是在抓拍图片之前发布的 以下是我用于预览的代码: 表面变化法 public void sur
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
try {
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
Camera.Parameters parameters = camera.getParameters();
try {
List<Camera.Size> supportedSizes = null;
supportedSizes = Compatibility.getSupportedPreviewSizes(parameters);
//preview form factor
float ff = (float)w/h;
Log.d("", "Screen res: w:"+ w + " h:" + h + " aspect ratio:" + ff);
//holder for the best form factor and size
float bff = 0;
int bestw = 0;
int besth = 0;
Iterator<Camera.Size> itr = supportedSizes.iterator();
while(itr.hasNext()) {
Camera.Size element = itr.next();
//current form factor
float cff = (float)element.width/element.height;
Log.d("Camera", "Candidate camera element: w:"+ element.width + " h:" + element.height + " aspect ratio:" + cff);
int currentRes = element.width*element.height;
//ff = Asp ratio of current Screen
// cff = Asp ratio of current Size from Size list
// bff = Asp ratio of current best aspect ratio selected
if ((Math.abs(ff-cff) <= Math.abs(ff-bff) ) ) {
bff=cff;
bestw = element.width;
besth = element.height;
}
}
Log.d("Camera", "Chosen camera element: w:"+ bestw + " h:" + besth + " aspect ratio:" + bff);
if ((bestw == 0) || (besth == 0)){
Log.d("Camera", "Using default camera parameters!");
bestw = 480;
besth = 320;
Log.d("Camera","Using default camera parameters! aspect ratio "+480/320);
}
parameters.setPreviewSize(bestw, besth);
//Handling camera angle
switch(this.getWindowManager().getDefaultDisplay().getRotation()){
case 0:
camera.setDisplayOrientation(90);
break;
case 1:
camera.setDisplayOrientation(0);
break;
case 2:
case 3:
camera.setDisplayOrientation(180);
break;
}
} catch (Exception ex) {
parameters.setPreviewSize(480 , 320);
}
camera.setParameters(parameters);
camera.startPreview();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void surfaceChanged(SurfaceHolder holder,int格式,int w,int h){
试一试{
holder.addCallback(本);
夹持器。设置类型(表面夹持器。表面夹持器类型推压缓冲);
Camera.Parameters=Camera.getParameters();
试一试{
列表支持的大小=空;
supportedSizes=兼容性。getSupportedPreviewSizes(参数);
//预览形状因子
浮动ff=(浮动)w/h;
Log.d(“,”屏幕分辨率:w:“+w+”h:“+h+”纵横比:”+ff);
//最佳形状系数和尺寸的支架
浮动bff=0;
int-bestw=0;
int-besth=0;
迭代器itr=supportedSizes.Iterator();
while(itr.hasNext()){
Camera.Size元素=itr.next();
//当前形状因子
float cff=(float)element.width/element.height;
Log.d(“摄影机”,“候选摄影机元素:w:”+element.width+“h:”+element.height+“纵横比:”+cff);
int currentRes=元素宽度*元素高度;
//ff=当前屏幕的Asp比率
//cff=大小列表中当前大小的Asp比率
//bff=当前选定的最佳纵横比的Asp比率
如果三星Note IV上的((Math.abs(ff cff),我意识到您不应该使用setPreviewSize(),即使您从getSupportedPreviewSizes()
获得的大小应该是合法的和可用的
这是三星低级相机软件中的一个笨拙的错误。不酷,三星!它只在一些设备上复制
然而,仍在拍摄的电影是无可挑剔的。
这是我的代码:
Camera.Parameters parameters = camera.getParameters();
boolean currentPreviewSettingsAreValid = parameters != null;
currentPreviewSettingsAreValid = currentPreviewSettingsAreValid && parameters.getPreviewSize() != null;
currentPreviewSettingsAreValid = currentPreviewSettingsAreValid && parameters.getPreviewSize().width > 0 && parameters.getPreviewSize().height > 0;
if (parameters != null && !currentPreviewSettingsAreValid) {
Camera.Size bestSize = getBestSizeOfSupported(parameters.getSupportedPreviewSizes(), width, height);
if (bestSize != null) {
parameters.setPreviewSize(bestSize.width, bestSize.height);
}
}
希望它能帮助任何人您选择了哪种预览大小?预览大小是480 x 320您的意思是,它会回落到480x320,因为没有一种支持的大小不够好?问题是,据我所知,S4不支持此分辨率。使用不支持的分辨率的结果是不可预测的。是的,它会回落到480*320。那么解决方案是什么?没有支持的预览尺寸符合您的标准。但是使用不支持的尺寸是不允许的。因此,您应该放宽标准,并在屏幕和相机尺寸不完全匹配时检查该固定纵横比。您能再多开源一点此相机代码吗?
Camera.Parameters parameters = camera.getParameters();
boolean currentPreviewSettingsAreValid = parameters != null;
currentPreviewSettingsAreValid = currentPreviewSettingsAreValid && parameters.getPreviewSize() != null;
currentPreviewSettingsAreValid = currentPreviewSettingsAreValid && parameters.getPreviewSize().width > 0 && parameters.getPreviewSize().height > 0;
if (parameters != null && !currentPreviewSettingsAreValid) {
Camera.Size bestSize = getBestSizeOfSupported(parameters.getSupportedPreviewSizes(), width, height);
if (bestSize != null) {
parameters.setPreviewSize(bestSize.width, bestSize.height);
}
}