2013-07-25 97 views
0

我做了一個使用surfaceView顯示相機preview.I得到了在開發者控制檯,許多報告與surfaceChanged部分錯誤的應用程序:提高Android攝像頭預覽

 @Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  

    Parameters parameters = mCamera.getParameters();     //// (Line 127) 

    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 

    Camera.Size previewSize = previewSizes.get(4); //480h x 720w  /// (Line 129) 

    parameters.setPreviewSize(previewSize.width, previewSize.height); 
    parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); 
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 

    mCamera.setParameters(parameters); 

    Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    if(display.getRotation() == Surface.ROTATION_0) 
    { 
     parameters.setPreviewSize(height, width);       
     mCamera.setDisplayOrientation(90); 
    } 

    if(display.getRotation() == Surface.ROTATION_90) 
    { 
     parameters.setPreviewSize(width, height);       
    } 

    if(display.getRotation() == Surface.ROTATION_180) 
    { 
     parameters.setPreviewSize(height, width);    
    } 

    if(display.getRotation() == Surface.ROTATION_270) 
    { 
     parameters.setPreviewSize(width, height); 
     mCamera.setDisplayOrientation(180); 
    } 


    mCamera.startPreview(); 
} 

第一個錯誤:

java.lang.IndexOutOfBoundsException (Line 129) 

第二錯誤:

java.lang.NullPointerException (Line 127) 

第三誤差:

java.lang.RuntimeException: set display orientation failed (when rotating cam 90*) 

大多數的錯誤報告是從三星Galaxy設備,但應用程序適用於LG的Nexus 4大 能有人給了表面的變化更穩定和可靠的方式來避免這樣的錯誤?

+0

這將有助於顯着,如果你能指出哪些行127和129是 –

+0

Derp,我沒有看到指出這些線的評論。對不起 –

回答

2

我不能100%確定是什麼導致了NullPointerException。如果有mCamera的NPE,那麼第128行也應該出錯。錯誤是在不同的時間發生的嗎?

IndexOutOfBoundsException很容易解釋; Galaxy設備上沒有5種預覽尺寸可供選擇,因此無法找到第5種尺寸並引發異常。

RuntimeException可能與第一個有關。

我建議在看CommonsWare的CWAC-相機庫,而不是,它可以處理很多這樣的事情對你(一般攝像頭API在Android上是很難的工作):https://github.com/commonsguy/cwac-camera

+1

感謝您的信任投票! :-) – CommonsWare

+0

老兄,我現在正在使用你的圖書館,爲我正在寫的一個自定義Snapchat客戶端,它耗費了我幾年的時間。相機API是一個很痛苦的工作,就像試圖找出SurfaceView拉伸旋轉等問題。 –

+0

我應該使用CWAC-Camera src中的哪個文件(SurfacePreviewStartegy或CameraView)請幫助我是初學者java&android – user2558256

3

java.lang.IndexOutOfBoundsException (Line 129)

隨機選擇第四預覽尺寸,認爲它奇蹟般地始終存在,並且總是「480h x 720w」,不會起作用。迭代預覽尺寸並選擇你想要的尺寸。

java.lang.NullPointerException (Line 127)

mCameranull,顯然。

java.lang.RuntimeException: set display orientation failed

不知道在這裏告訴你什麼。它可能會與前置攝像頭和後置攝像頭綁在一起,因爲度數的解釋不同。給定一個degrees變量保持0,90,180或270(匹配Surface.ROTATION_0等的值),和一個名爲infoCamera.Info,我使用在CWAC-Camera以下:

if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
    displayOrientation=(info.orientation + degrees) % 360; 
    displayOrientation=(360 - displayOrientation) % 360; 
} 
else { 
    displayOrientation=(info.orientation - degrees + 360) % 360; 
} 

camera.setDisplayOrientation(displayOrientation); 

我把來自the JavaDocs for setDisplayOrientation()

+0

那麼它是否可以通過用我的代碼替換你的代碼? – user2558256

+0

我只使用後置攝像頭 – user2558256