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)后成功重启视频预览?
谢谢!
android surface清空,Android:如何在surfaceDestroyed()之后重启视频预览?相关推荐
- android抖音切换实现,【Android 进阶】仿抖音系列之视频预览和录制(五)
前言 大家好,在前几篇中,我们通过2种方式实现了仿抖音的翻页切换视频,仿抖音列表播放视频功能:这一篇,我们来说说视频的录制. 主流的视频录制,一般都采用的是FFmpeg 例如 腾讯短视频,由于FFmp ...
- Android Camera使用OpenGL ES 2.0和TextureView对预览进行实时二次处理(黑白滤镜)
本系列教程会有三篇文章讲解Android平台滤镜的实现方式,希望在阅读本文之前先阅读下述第一篇文档,因为第一篇讲过的知识,本文并不会细讲了. 第一篇 Android Camera使用OpenGL ES ...
- android surfaceview 大小,Android设置SurfaceView任意大小、任意位置、保持预览宽高比与屏...
Android设置SurfaceView任意大小.任意位置.保持预览宽高比与屏 Android设置SurfaceView任意大小.任意位置.保持预览宽高比与屏显一致 一.任意大小.任意位置 1) 代码 ...
- OpenGL.ES在Android上的简单实践:20-水印录制(预览+透明水印 表情 弹幕 gl_blend)
OpenGL.ES在Android上的简单实践:20-水印录制(预览 gl_blend) 1.继续画出预览帧 紧接着上篇文章,既然是要画出预览帧,按照之前其他项目的架构组成.我们是通过模型FrameR ...
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...
- android显示视频预览
android 11 kotlin显示视频预览 权限 读sd卡中的mp4文件的权限 <uses-permission android:name="android.permission. ...
- Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)
第一篇 Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜) 第二篇 Android Camera使用OpenGL ES 2.0和T ...
- android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧
android ffmpeg 仿剪映播放器 剪辑视频 预览条 快速精准抽帧 由于本人想学习音视频相关的东西,所以找了剪映作为借鉴,通过仿照剪映的功能学习音视频相关的东西,所以有了这个项目 暂时这个项目 ...
- Python - 如何在Tkinter窗口中显示视频预览
from moviepy.editor import * from moviepy.video.fx.resize import resize import pygame pygame.display ...
最新文章
- LeetCode 468. Validate IP Address--笔试题--Python解法
- 如何用简单易懂的例子解释隐马尔可夫模型?
- 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器...
- 数据之“星”再燃,第二届「星斗奖」申报正式启动!
- Python中常见的配置文件写法分享!
- spring cloud Hystrix
- 11.10 chkconfig:管理开机服务
- avogadro_Avogadro
- 超级SEO静态页面生成系统源码
- 计算机科学之美,计算机科学的美学探讨
- 产品体验报告:在行APP分析
- UEFI开发与调试---文件操作
- 关于如何查找NXP S32K1xx系列单片机的封装信息和引脚定义
- crystaldiskmark使用
- 一级域名 二级域名,三级域名概念 -- linux内核
- php换行快捷输入,excel中换行的快捷键是什么
- 使用版本控制软件TortoiseSVN对程序和文档进行控制的说明
- textaligncenter仍然不居中_你不知道的中华文化,中华文化的根源不是儒家而是河图洛书...
- 用VB评估数学表达式
- java反射机制之Method invoke执行调用方法例子