2011-02-16 135 views
4

我有一個問題。 我試圖開發一個使用相機的程序,一切都在我的設備上工作,但像許多人知道CameraPreview在所有設備上都不以相同的方式工作,所以我試圖整合谷歌提供的代碼這個地址:安卓相機預覽

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

我所面臨的問題是,我不知道如何整合到我的項目,這裏是我的代碼和我做了什麼不超過:

Preview mPreview; 
private Camera mCamera; 

    @Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mPreview = new Preview(this); 

     //ContentView---------------------------------------------------------- 
     setContentView(R.layout.main); 

     mSurfaceView = (SurfaceView)findViewById(R.id.camera_surface); 

     mPreview.surfacemetod(mSurfaceView); 

    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume();  

     mCamera = Camera.open(); 
     mPreview.setCamera(mCamera); 

然後預覽課程:

class Preview extends ViewGroup implements SurfaceHolder.Callback { 
private final String TAG = "Preview"; 

SurfaceView mSurfaceView; 
SurfaceHolder mHolder; 
Size mPreviewSize; 
List<Size> mSupportedPreviewSizes; 
Camera mCamera; 

Preview(Context context) { 
    super(context); 

    mSurfaceView = new SurfaceView(context); 
    addView(mSurfaceView); 

} 

public void surfacemetod(SurfaceView surface){ 

    //mSurfaceView = new SurfaceView(context); 
    //addView(mSurfaceView); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = mSurfaceView.getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

} 

public void setCamera(Camera camera) { 
    mCamera = camera; 
    if (mCamera != null) { 
     mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
     requestLayout(); 
    } 
} 

此代碼之後,上面的鏈接中有所有的方法,我沒有複製,以節省空間。

的問題是,當我運行代碼的mPreviewSize.with和mPreviewSize.height

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    Camera.Parameters parameters = mCamera.getParameters(); 
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
    requestLayout(); 

    mCamera.setParameters(parameters); 
    mCamera.startPreview(); 
} 

是空的,我得到一個強制關閉

本質上看起來並不裏面OnMeasure得到解決它們。 有什麼想法?

這是日誌:

02-16 13:54:26.068: ERROR/AndroidRuntime(24374): FATAL EXCEPTION: main 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374): java.lang.NullPointerException 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at com.dashboard.camera.lite.Preview.surfaceChanged(Preview.java:162) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.SurfaceView.updateWindow(SurfaceView.java:554) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.SurfaceView.dispatchDraw(SurfaceView.java:341) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.View.draw(View.java:6796) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.widget.FrameLayout.draw(FrameLayout.java:354) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.View.draw(View.java:6796) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.widget.FrameLayout.draw(FrameLayout.java:354) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1894) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewRoot.draw(ViewRoot.java:1432) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1174) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1752) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.os.Handler.dispatchMessage(Handler.java:99) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.os.Looper.loop(Looper.java:123) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at android.app.ActivityThread.main(ActivityThread.java:4627) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at java.lang.reflect.Method.invokeNative(Native Method) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at java.lang.reflect.Method.invoke(Method.java:521) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

02-16 13:54:26.068: ERROR/AndroidRuntime(24374):  at dalvik.system.NativeStart.main(Native Method) 

回答

0

你可以通過日誌? 我預測你有一個mPreview.width/height的問題 - 它可能有些不正確的值。

+0

對不起,我犯了一個錯誤,我得到了FORCE CLOSE,如上所述,如果在surfacemetod中我改變了這一行: mHolder = surface.getHolder(); – Adelchi 2011-02-16 12:57:40