Android Camera应用程序 - 暂停/退出时出错

时间:2011-08-18 05:11:10

标签: android camera

每次退出/暂停相机活动时,我的应用程序都会崩溃。我认为这可能与在暂停/退出时释放相机有关,但我不确定在哪里做到这一点。非常感谢您的解释。谢谢!


CameraActivity.java


public class CameraActivity extends Activity {
Preview preview; 
Button buttonClick; 

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    preview = new Preview(this);

    ((FrameLayout) findViewById(R.id.preview)).addView(preview);

    buttonClick = (Button) findViewById(R.id.buttonClick);

    buttonClick.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            preview.camera.takePicture(shutterCallback, rawCallback,
                    jpegCallback);
        }
    });
}

ShutterCallback shutterCallback = new ShutterCallback() {
    @Override
    public void onShutter() {
    }
};

PictureCallback rawCallback = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
    }
};

PictureCallback jpegCallback = new PictureCallback() { // <8>
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
                    doSomeStuff();                        
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            camera.stopPreview();
            camera.startPreview();
        }
    }
};
}

Preview.java


public class Preview extends SurfaceView implements SurfaceHolder.Callback { 
SurfaceHolder mHolder;
public Camera camera; 

Preview(Context context) {
    super(context);

    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open(); 
    camera.setDisplayOrientation(90);

    try {

        camera.setPreviewDisplay(holder); 
        camera.setPreviewCallback(new PreviewCallback() { 
            public void onPreviewFrame(byte[] data, Camera camera) { 
                Preview.this.invalidate(); 
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview();
    camera.release();
    camera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    camera.startPreview();
}

}

编辑:这是例外

08-18 01:18:50.242: ERROR/AndroidRuntime(10222): FATAL EXCEPTION: main
08-18 01:18:50.242: ERROR/AndroidRuntime(10222): java.lang.RuntimeException: Method called after release()
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at android.hardware.Camera.setHasPreviewCallback(Native Method)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at android.hardware.Camera.access$600(Camera.java:114)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at android.hardware.Camera$EventHandler.handleMessage(Camera.java:545)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at android.os.Looper.loop(Looper.java:143)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at android.app.ActivityThread.main(ActivityThread.java:4196)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at java.lang.reflect.Method.invokeNative(Native Method)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at java.lang.reflect.Method.invoke(Method.java:507)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-18 01:18:50.242: ERROR/AndroidRuntime(10222):     at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:1)

编辑:对不起,我收回了以前的解决方案。 问题在于onPreviewFrame回调,为什么需要它呢?设置预览显示后,您无需使视图无效,相机会自动完成。