當我使用意圖將活動留給其他活動時,surfaceView類崩潰。我如何離開這個活動進行另一個活動而不會崩潰?當退出活動時SurfaceView類崩潰,Android
我用這個意圖離開這個階級和打開另一項活動叫CameraView類:
04-08 21:42:46.620: W/IInputConnectionWrapper(25016): finishComposingText on inactive InputConnection
04-08 21:42:46.630: E/SurfaceView(25016): NullPointerException while updating window.
mSession = [email protected], mWindow = [email protected]
04-08 21:42:46.630: E/SurfaceView(25016): Unexpected NullPointerException.
04-08 21:42:46.630: D/AndroidRuntime(25016): Shutting down VM
04-08 21:42:46.630: W/dalvikvm(25016): threadid=1: thread exiting with uncaught exception (group=0x40aca9d8)
04-08 21:42:46.640: E/AndroidRuntime(25016): FATAL EXCEPTION: main
04-08 21:42:46.640: E/AndroidRuntime(25016): java.lang.NullPointerException
04-08 21:42:46.640: E/AndroidRuntime(25016): at android.view.SurfaceView.updateWindow(SurfaceView.java:578)
04-08 21:42:46.640: E/AndroidRuntime(25016): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:226)
surfaceView活動代碼:
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
DrawOnTop mDrawOnTop;
Preview(Context context, DrawOnTop drawOnTop) {
super(context);
mDrawOnTop = drawOnTop;
mFinished = false;
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
// Preview callback used whenever new viewfinder frame is available
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera)
{
if ((mDrawOnTop == null) || mFinished)
return;
if (mDrawOnTop.mBitmap == null)
{
// Initialize the draw-on-top companion
Camera.Parameters params = camera.getParameters();
mDrawOnTop.mImageWidth = params.getPreviewSize().width;
mDrawOnTop.mImageHeight = params.getPreviewSize().height;
mDrawOnTop.mBitmap = Bitmap.createBitmap(mDrawOnTop.mImageWidth,
mDrawOnTop.mImageHeight, Bitmap.Config.RGB_565);
mDrawOnTop.mRGBData = new int[mDrawOnTop.mImageWidth * mDrawOnTop.mImageHeight];
mDrawOnTop.mYUVData = new byte[data.length];
}
// Pass YUV data to draw-on-top companion
System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length);
mDrawOnTop.invalidate();
}
});
}
catch (IOException exception) {
mFinished = true;
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
// Because the CameraDevice object is not a shared resource, it's very
// important to release it when the activity is paused.
mFinished = true;
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
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(320, 240);
parameters.setPreviewFrameRate(15);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
} // end surfaceview
什麼? 'System.exit()的'?真的嗎?!? – 2014-03-27 09:26:44
切勿使用System.exit()。瞭解活動的生命週期如何影響您的相機流量。閱讀相機的文檔以瞭解何時調用startPreview(),stopPreview()以及何時釋放相機資源。 – 2015-06-19 07:53:53