2012-08-23 45 views
1

我寫了一個豆蔻攝像頭,機應用我已閱讀本教程後:CameraView只能在模擬器

http://www.brighthub.com/mobile/google-android/articles/43414.aspx

在模擬器中一切工作正常(正常,有沒有攝像頭,但至少有沒有錯誤;))

然後我試着讓它在我的HTC Wildfire S上運行。但是在啓動後立即崩潰了。

這裏是我的活動的代碼,也許有人有一個想法,如何解決這一問題:

public class CameraView extends Activity implements SurfaceHolder.Callback { 

    android.hardware.Camera mCamera; 
    boolean mPreviewRunning = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.camera_surface); 
     SurfaceView mSurfaceView = (SurfaceView)findViewById(R.id.surface_camera); 
     SurfaceHolder mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 


    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     mCamera = android.hardware.Camera.open(); 
    } 


    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     if(mPreviewRunning) { 
      mCamera.stopPreview(); 
     } 

     android.hardware.Camera.Parameters params = mCamera.getParameters(); 
     params.setPreviewSize(width, height); 
     mCamera.setParameters(params); 

     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

     mCamera.startPreview(); 
     mPreviewRunning = true; 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCamera.stopPreview(); 
     mPreviewRunning = false; 
     mCamera.release(); 
    } 

    android.hardware.Camera.PictureCallback mPictureCallback = new android.hardware.Camera.PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 

     } 
    }; 
} 
+0

崩潰的logcat輸出是什麼? –

+0

它不會在模擬器中崩潰。只在我的設備上。有沒有辦法直接用LogCat輸出在手機上進行調試? – snix

+0

是的。請參閱http://developer.android.com/tools/device.html。 –

回答

1

你得到一個例外,因爲你正試圖使相機使用的寬度和高度沒有關係不支持。您要求它使用SurfaceView的寬度和高度,這很少與所支持的預覽尺寸之一匹配。相反,請嘗試使用以下內容:

public class CameraView extends Activity implements SurfaceHolder.Callback { 

android.hardware.Camera mCamera; 
boolean mPreviewRunning = false; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    getWindow().setFormat(PixelFormat.TRANSLUCENT); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.camera_surface); 
    SurfaceView mSurfaceView = (SurfaceView)findViewById(R.id.surface_camera); 
    SurfaceHolder mSurfaceHolder = mSurfaceView.getHolder(); 
    mSurfaceHolder.addCallback(this); 
    mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 


@Override 
public void surfaceCreated(SurfaceHolder holder) { 
try { 
     mCamera.setPreviewDisplay(previewHolder); 
    } 
    catch (Throwable t) { 
     Log.e(TAG, "Exception in setPreviewDisplay()", t); 
    } 
} 


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Camera.Parameters parameters=camera.getParameters(); 
    Camera.Size size=getBestPreviewSize(width, height, parameters); 

    if (size!=null) { 
     parameters.setPreviewSize(size.width, size.height); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
     inPreview=true; 
    } 
    } 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mCamera.stopPreview(); 
    mPreviewRunning = false; 
    mCamera.release(); 
} 

android.hardware.Camera.PictureCallback mPictureCallback = new android.hardware.Camera.PictureCallback() { 

    @Override 
    public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 

    } 
}; 

    private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width<=width && size.height<=height) { 
      if (result==null) { 
       result=size; 
      } 
      else { 
       int resultArea=result.width*result.height; 
       int newArea=size.width*size.height; 

       if (newArea>resultArea) { 
        result=size; 
       } 
      } 
     } 
    } 

    return(result); 
} 
} 

此代碼全部改編自我爲我的書寫的代碼。我改變了一些你的代碼,所以一些變量名和導入可能需要修復,但它應該可以正常工作。

getBestPreviewSize()是這裏用來計算最佳和最佳相機預覽尺寸的神奇方法。

+0

不錯的解決方案。非常感謝你! 但你有一個想法,如何旋轉相機預覽,我可以在肖像模式下看到它? – snix

+0

只需將寬度作爲高度,將高度作爲寬度。此外,將活動的屏幕方向聲明爲清單中的肖像。 –

+0

預覽的旋轉仍然不正確。我試圖使用「setRotation」,但沒有改變。 – snix