android surface清空,Android:如何在surfaceDestroyed()之后重启视频预览?

我通过以下方式创建了一个CapturePreview类和CameraManager类:

CapturePreview:

public class CaptureView extends SurfaceView implements Callback{

private final SurfaceHolder surfaceHolder;

FileReaderWriter fileRW;

int frameCount;

private static final int MSG_FRAME_REFRESHED = 1;

private static final int MSG_AUTOFOCUS = 2;

private final CameraManager mCameraManager;

private boolean mRecording;

public CaptureView(Context context, AttributeSet attrs)

{

super(context, attrs);

surfaceHolder = getHolder();

surfaceHolder.addCallback(this);

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

CameraManager.init(context);

mCameraManager = CameraManager.get();

init(context);

}

public CaptureView(Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle);

surfaceHolder = getHolder();

surfaceHolder.addCallback(this);

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceHolder.setSizeFromLayout();

CameraManager.init(context);

mCameraManager = CameraManager.get();

init(context);

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

mCameraManager.startPreview();

//mCameraManager.requestPreviewFrame(mCameraHandler, MSG_FRAME_REFRESHED);

mCameraManager.requestAutoFocus(mCameraHandler, MSG_AUTOFOCUS);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

try

{

mCameraManager.openDriver(surfaceHolder);

}

catch(Exception e)

{

//TODO: display error

}

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

mCameraManager.stopPreview();

}

private void init(Context context)

{

setFocusable(true);

mRecording = false;

fileRW = new FileReaderWriter();

frameCount = 0;

}

public void setRecording(boolean isRecording) {

this.mRecording = isRecording;

}

public boolean isRecording() {

return mRecording;

}

private Handler mCameraHandler = new CameraHandler();

private class CameraHandler extends Handler

{

@Override

public void handleMessage(Message msg)

{

switch(msg.what)

{

case MSG_FRAME_REFRESHED:

// String path = "JPGFrame" + frameCount;

// fileRW.setPath(path);

// fileRW.WriteToFile((byte[]) msg.obj);

// frameCount++;

break;

}

}

}

}

CameraManager:

public final class CameraManager {

@Override

protected void finalize() throws Throwable {

closeDriver();

super.finalize();

}

private static final String TAG = "CameraManager";

private static CameraManager mCameraManager;

private Camera mCamera;

private final Context mContext;

private Point mScreenResolution;

private Rect mFramingRect;

private Handler mPreviewHandler;

private int mPreviewMessage;

private Handler mAutoFocusHandler;

private int mAutoFocusMessage;

private boolean mPreviewing;

public static synchronized void init(Context context) {

if (mCameraManager == null) {

mCameraManager = new CameraManager(context);

mCameraManager.getScreenResolution();

}

}

public static CameraManager get() {

return mCameraManager;

}

private CameraManager(Context context) {

mContext = context;

mCamera = null;

mPreviewing = false;

}

public void openDriver(SurfaceHolder holder) throws IOException {

// "throws IOException added to accommodate Android 1.5

if (mCamera == null) {

mCamera = Camera.open();

setCameraParameters();

mCamera.setPreviewDisplay(holder);

}

}

public void closeDriver() {

if (mCamera != null) {

mCamera.release();

mCamera = null;

}

}

public void startPreview() {

if (mCamera != null && !mPreviewing) {

mCamera.startPreview();

mPreviewing = true;

}

}

public void stopPreview() {

if (mCamera != null && mPreviewing) {

mCamera.setPreviewCallback(null);

mCamera.stopPreview();

mPreviewHandler = null;

mAutoFocusHandler = null;

mPreviewing = false;

}

}

public void requestPreviewFrame(Handler handler, int message) {

if (mCamera != null && mPreviewing) {

mPreviewHandler = handler;

mPreviewMessage = message;

mCamera.setPreviewCallback(previewCallback);

}

}

public void requestAutoFocus(Handler handler, int message) {

if (mCamera != null && mPreviewing) {

mAutoFocusHandler = handler;

mAutoFocusMessage = message;

mCamera.autoFocus(autoFocusCallback);

}

}

public Rect getFramingRect() {

if (mFramingRect == null) {

int size = ((mScreenResolution.x < mScreenResolution.y) ? mScreenResolution.x :

mScreenResolution.y) * 3 / 4;

int leftOffset = (mScreenResolution.x - size) / 2;

int topOffset = (mScreenResolution.y - size) / 2;

mFramingRect = new Rect(leftOffset, topOffset, leftOffset + size, topOffset + size);

}

return mFramingRect;

}

PreviewCallback previewCallback = new PreviewCallback()

{

@Override

public void onPreviewFrame(byte[] data, Camera camera) {

if(mPreviewHandler != null)

{

Message message = mPreviewHandler.obtainMessage(mPreviewMessage,

mScreenResolution.x, mScreenResolution.y, data);

message.sendToTarget();

}

}

};

AutoFocusCallback autoFocusCallback = new AutoFocusCallback()

{

@Override

public void onAutoFocus(boolean success, Camera camera) {

if(mAutoFocusHandler != null)

{

Message message = mAutoFocusHandler.obtainMessage(mAutoFocusMessage, success);

message.sendToTarget();

}

}

};

private void setCameraParameters() {

Camera.Parameters parameters = mCamera.getParameters();

parameters.setPreviewSize(mScreenResolution.x, mScreenResolution.y);

parameters.setPictureFormat(PixelFormat.JPEG);

parameters.setPreviewFormat(PixelFormat.JPEG);

mCamera.setParameters(parameters);

}

private Point getScreenResolution() {

if (mScreenResolution == null) {

WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

mScreenResolution = new Point(display.getWidth(), display.getHeight());

}

return mScreenResolution;

}

}

视频预览可以正常工作,直到子活动在主活动中开始。当子活动开始时,调用CaptureView.surfaceDestroyed(SurfaceHolder holder)并停止视频预览。然后当子活动关闭时,执行CaptureView.surfaceCreated(SurfaceHolder holder),但视频预览不会启动。

有没有人知道如何解决问题,以便在执行surfaceDestroyed(SurfaceHolder holder)后成功重启视频预览?

谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值