我通过以下方式创建了一个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)后成功重启视频预览?

谢谢!

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

  1. android抖音切换实现,【Android 进阶】仿抖音系列之视频预览和录制(五)

    前言 大家好,在前几篇中,我们通过2种方式实现了仿抖音的翻页切换视频,仿抖音列表播放视频功能:这一篇,我们来说说视频的录制. 主流的视频录制,一般都采用的是FFmpeg 例如 腾讯短视频,由于FFmp ...

  2. Android Camera使用OpenGL ES 2.0和TextureView对预览进行实时二次处理(黑白滤镜)

    本系列教程会有三篇文章讲解Android平台滤镜的实现方式,希望在阅读本文之前先阅读下述第一篇文档,因为第一篇讲过的知识,本文并不会细讲了. 第一篇 Android Camera使用OpenGL ES ...

  3. android surfaceview 大小,Android设置SurfaceView任意大小、任意位置、保持预览宽高比与屏...

    Android设置SurfaceView任意大小.任意位置.保持预览宽高比与屏 Android设置SurfaceView任意大小.任意位置.保持预览宽高比与屏显一致 一.任意大小.任意位置 1) 代码 ...

  4. OpenGL.ES在Android上的简单实践:20-水印录制(预览+透明水印 表情 弹幕 gl_blend)

    OpenGL.ES在Android上的简单实践:20-水印录制(预览 gl_blend) 1.继续画出预览帧 紧接着上篇文章,既然是要画出预览帧,按照之前其他项目的架构组成.我们是通过模型FrameR ...

  5. Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...

  6. android显示视频预览

    android 11 kotlin显示视频预览 权限 读sd卡中的mp4文件的权限 <uses-permission android:name="android.permission. ...

  7. Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)

    第一篇 Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜) 第二篇 Android Camera使用OpenGL ES 2.0和T ...

  8. android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧

    android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧 由于本人想学习音视频相关的东西,所以找了剪映作为借鉴,通过仿照剪映的功能学习音视频相关的东西,所以有了这个项目 暂时这个项目 ...

  9. Python - 如何在Tkinter窗口中显示视频预览

    from moviepy.editor import * from moviepy.video.fx.resize import resize import pygame pygame.display ...

最新文章

  1. LeetCode 468. Validate IP Address--笔试题--Python解法
  2. 如何用简单易懂的例子解释隐马尔可夫模型?
  3. 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器...
  4. 数据之“星”再燃,第二届「星斗奖」申报正式启动!
  5. Python中常见的配置文件写法分享!
  6. spring cloud Hystrix
  7. 11.10 chkconfig:管理开机服务
  8. avogadro_Avogadro
  9. 超级SEO静态页面生成系统源码
  10. 计算机科学之美,计算机科学的美学探讨
  11. 产品体验报告:在行APP分析
  12. UEFI开发与调试---文件操作
  13. 关于如何查找NXP S32K1xx系列单片机的封装信息和引脚定义
  14. crystaldiskmark使用
  15. 一级域名 二级域名,三级域名概念 -- linux内核
  16. php换行快捷输入,excel中换行的快捷键是什么
  17. 使用版本控制软件TortoiseSVN对程序和文档进行控制的说明
  18. textaligncenter仍然不居中_你不知道的中华文化,中华文化的根源不是儒家而是河图洛书...
  19. 用VB评估数学表达式
  20. java反射机制之Method invoke执行调用方法例子

热门文章

  1. 基于Bayes和SVM的垃圾邮件分类实现(改进版)
  2. 大学计算机基础知识点word,大学计算机基础考试知识重点
  3. openwrt无线连接互联网的实现原理【2】
  4. 【算法】网易云音乐日推算法浅析
  5. ExitProcess与TerminateProcess函数
  6. 用java编写cs游戏_Java CS训练小游戏
  7. Unity SRP Batcher的工作原理
  8. 计算机专业高性能商务本推荐,联想商务笔记本哪款好 五个型号推荐
  9. python实现人格分析
  10. Word批注模式,修改用户名