Android三星Galaxy S4定制相机预览失真

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

我在使用target sdk 22构建的应用程序中使用自定义摄像头。我已经通过我的应用程序在很多设备上测试了摄像头,包括三星S5、三星Note 4和华为ascend mate 7,图像预览很好

但当我在三星Galaxy S4(安卓5.0.1)上通过应用程序打开相机时,我的相机预览失真了。以下是预览的图像:

我在stackoverflow上看到过很多帖子,但它们都是在抓拍图片之后发布的,我的问题是在抓拍图片之前发布的

以下是我用于预览的代码:

  • 表面变化法

         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);
            }
        }