2011-02-16 145 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