2015-08-28 166 views
2

我在我的应用程序中使用目标sdk 22构建自定义相机。我已经通过我的应用程序在包括三星S5,三星Note 4和华为登台队友7和图像预览很好。Android三星Galaxy S4自定义相机预览失真

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

enter image description here

我看到的计算器很多帖子,但他们对我的问题,拍摄图像后,是拍摄照片前。

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

  1. surfaceChanged方法

     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(); 
        } 
    } 
    
  2. Compatibility.getSupportedPreviewSizes(参数)方法

    @SuppressWarnings("unchecked") 
    public static List<Camera.Size> getSupportedPreviewSizes(Camera.Parameters params) { 
    List<Camera.Size> retList = null; 
    
    try { 
        Object retObj = mParameters_getSupportedPreviewSizes.invoke(params); 
        if (retObj != null) { 
         retList = (List<Camera.Size>)retObj; 
        } 
    } 
    catch (InvocationTargetException ite) { 
        /* unpack original exception when possible */ 
        Throwable cause = ite.getCause(); 
        if (cause instanceof RuntimeException) { 
         throw (RuntimeException) cause; 
        } else if (cause instanceof Error) { 
         throw (Error) cause; 
        } else { 
         /* unexpected checked exception; wrap and re-throw */ 
         throw new RuntimeException(ite); 
        } 
    } catch (IllegalAccessException ie) { 
        //System.err.println("unexpected " + ie); 
    } 
    return retList; 
    } 
    

我将不胜感激任何形式的帮助。

在此先感谢。

+0

你会选择哪一个预览大小? –

+0

预览尺寸为480×320 – Sateesh

+0

您的意思是,它回落到480x320,因为没有支持的尺寸不够好?据我所知,问题在于S4不支持该决议。使用不支持的分辨率的结果是不可预知的。 –

回答

0

在Samsung Note IV上,我意识到您不应该使用setPreviewSize(),即使您从getSupportedPreviewSizes()获得的尺寸应该合法且可用。

这是三星的低级相机软件中的一个尴尬的错误。 Uncool,三星!它仅通过一些设备进行再现。

然而,仍然拍摄是无可挑剔的。 所以,这里是我的代码:

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

希望能有助于任何人

+0

你可以开放源码这个相机代码多一点? – rupinderjeet