Android Camera应用开发小结

 


       近期做了一段时间的Camera的开发,虽然是应用层的开发但是也粗略的接触了一些framework相关的东西,在此写出来分享下。
       先说下应用开发的目的和实用环境,这次开发的主要目的是实现android设备上外挂USB摄像头来实现录像拍照的功能,类似行车记录仪的功能,但是灵活性更大因为可随时在android设备上回看录像和回看照片,并可查看GPS的运行轨迹,当然主要功能还是录像和拍照功能了。</p><p>     首先还是要做一个简单的demo功能出来,后面再逐渐的去丰富各个功能模块和完善BUG。
       第一步肯定是建工程了,一个主Activity用来显示录像预览的图像,并且设计简单的按钮分别来实现开始关闭录像,拍照,浏览录像和照片等功能。      当然首先还是要在AndroidManifest.xml中加入 

       <uses-permission android:name = "android.permission.CAMERA" /> 
      <uses-feature android:name = "android.hardware.camera" /> 
      <uses-feature android:name = "android.hardware.camera.autofocus" /> 
      <uses-permission android:name = "android.permission.RECORD_AUDIO"></span>

 

      之所以加入RECORD_AUDIO是因为后期可能会加入声音录入,因此提前加进来。

        主Activity需要实现OnClickListener,SurfaceHolder.Callback,OnCheckChangeListener等接口,因为所设计的按钮分别需要监听Click,录像模式选择会监听CheckBox的动作。

       核心代码

               下面的函数主要是实现Camera取景预览的界面,并且初始化了应用的初始界面,包括按钮和预览界面。

                    取景的容器为SurfaceView,使用它必须用到SurfaceHolder,它可以随时监听Surface的变化。并且需要将SurfaceHolder的类型设置为SURFACE_TYPE_PUSH_BUFFERS.这样画面缓存会由Camera类来管理。

              
	private void initView() {
		display = (SurfaceView) findViewById(R.id.display);
		surfaceHolder = display.getHolder();
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

		camera = (ImageButton) findViewById(R.id.camera);
		video_record = (CheckBox) findViewById(R.id.video);
		camera_shoot = (ImageButton) findViewById(R.id.shoot);
		
		explorer = (Button) findViewById(R.id.explorer);
		settings = (Button) findViewById(R.id.settings);
                                         
		surfaceHolder.addCallback(this);
		surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
		surfaceHolder.setFixedSize(1280,720);
		camera.setOnClickListener(this);
		camera_shoot.setOnClickListener(this);
		
		explorer.setOnClickListener(this);
		settings.setOnClickListener(this);
		timer = (TextView)findViewById(R.id.timer);

                  video_record.setOnClickListener(this);
	}

          Camera录像拍照等功能我实现均在另一个Service中,目的也是可以实现后台录像的功能,并随时监听操作。

               核心代码

                       此处代码主要是完成录像画面的预览,其中会进行USB设备的热插拔监听,拍照Camera属性设置已经Camera对象的初始化,打开预览等操作。

		public void surfaceCreate() throws RemoteException { 
			Log.e(TAG, "surfaceCreate");
			mSurfaceHolder = application.getSurfaceHolder();
			handler.removeCallbacks(USBtask);
			handler.postDelayed(USBtask, 5000);
			try {
				if(!screen_on){
					screen_on = true;
					handler.sendEmptyMessage(GPS_INTERVAL);
					handler.sendEmptyMessageDelayed(RESUME, 3000);
					return;
				}


 

				if(mCamera == null){
					mCamera = Camera.open(cameraId);
					cameraPictureParamsSet();
					mCamera.setPreviewDisplay(mSurfaceHolder);
					startPreview();
					Log.e(TAG, "surfaceCreate mCamera is null, startPreview!");
					if(isRecording){
						cameraListener.autoStartRecord();
						startRecord();
					}
				}else{
  
					if(isRecording)
						cameraListener.autoStartRecord();
					mCamera.setPreviewDisplay(mSurfaceHolder);
					startPreview();
					Log.e(TAG, "surfaceCreate mCamera is not null, startPreview!");
				}
			} catch (IOException e) {
				e.printStackTrace();
			}catch(RuntimeException e){
				cameraListener.noCamera();
			}
		}

                 

            这部分代码就是录像的主要代码了,其中主要涉及到了MediaRecorder的部分操作,包括它输出视频流保存的格式和压缩方式,码率和码流,分辨率等参数的设置。因此处较易出现异常因此建议多catch异常以免程序崩溃。

	private void recordstart(boolean tts){
		hour = 0;
		minute = 0;
		second = 0;
		if (mMediaRecorder == null){
			mMediaRecorder = new MediaRecorder();
		}else{
       	 	mMediaRecorder.reset();
       	 	try {
				mCamera.reconnect();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
        }
		cameraPictureParamsSet();
		mCamera.unlock();
		if(mSurfaceHolder == null)
			mCamera.stopPreview();
        mMediaRecorder.setCamera(mCamera);
        boolean record_toggle = preference.getBoolean("record", true);
        if(record_toggle){
        	mMediaRecorder
            .setAudioSource(MediaRecorder.AudioSource.MIC);
        }
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setVideoFrameRate(mVideoFrameRate);
        mMediaRecorder.setVideoSize(1280, 720);
        mMediaRecorder.setVideoEncodingBitRate(4000000);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        if(record_toggle){
        	mMediaRecorder
             .setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        	mMediaRecorder.setAudioChannels(1);
        	mMediaRecorder.setAudioSamplingRate(8000);
        }
       mMediaRecorder.setMaxDuration(max_duration_ms);
       mMediaRecorder.setOnErrorListener(CameraService.this);
       mMediaRecorder.setOnInfoListener(CameraService.this);
       getVideoName();
       if(isPathValid){
           try {
  
           	recordingPath = getVideoName().getAbsolutePath();
           	mMediaRecorder.setOutputFile(recordingPath);
           	fileUtils.setRecordingfile(recordingPath);
               mMediaRecorder.prepare();
               mMediaRecorder.start();
               handler.removeCallbacks(task);
               if(isPathValid){
          			handler.postDelayed(task, 1000);
               }
               cameraListener.autoStartRecord();
               if(tts)
               	tts(getString(R.string.isrecodering));
               isRecording = true;
           } catch (IllegalStateException e) {
              
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是Android开发与应用,原书配套的课件,作者张荣,目录如下。 第1章 Android简介 1.1 手机操作系统 1.2 Android起源 1.3 Android特征 1.4 Android体系结构 1.4.1 应用层 1.4.2 应用框架层 1.4.3 系统库层 1.4.4 内核层 1.5 小结 练习 第2章 Android开发环境 2.1 Java开发环境安装 2.1.1 安装JDK 2.1.2 安装Eclipse 2.1.3 Eclipse中文包的安装 2.2 Android SDK 2.2.1 安装ADT 2.2.2 安装Android SDK 2.3 Android模拟器 2.3.1 创建AVD 2.3.2 开发环境测试 2.3.3 模拟器的使用 2.4 SDK中的常用命令 2.4.1 adb命令 2.4.2 Android命令 2.5 小结 练习 第3章 Android应用程序框架 3.1 第一个Android应用程序 3.2 Android项目结构 3.3 APK文件结构 3.4 Android应用程序权限 3.5 Activity及其生命周期 3.5.1 什么是Activity 3.5.2 Activity生命周期 3.6 Intent简介 3.6.1 Intent属性与过滤器 3.6.2 Intent启动系统Activity 3.7 小结 练习 第4章 视图组件 4.1 视图组件的使用模式 4.1.1 视图组件的定义 4.1.2 资源的访问 4.1.3 生成视图组件资源标识 4.1.4 视图组件的引用 4.1.5 视图组件的事件响应 4.1.6 组件的常用属性 4.2 常用组件 4.2.1 文本框 4.2.2 编辑框 4.2.3 图片按钮 4.2.4 图片视图 4.2.5 单选按钮 4.2.6 复选按钮 4.2.7 下拉列表 4.2.8 自动完成文本框 4.2.9 日期、时间选择器 4.3 高级组件 4.3.1 进度条 4.3.2 拖动条 4.3.3 评分条 4.3.4 选项卡 4.4 提示框与警告对话框 4.4.1 消息提示框 4.4.2 警告对话框 4.5 小结 练习 第5章 视图界面布局 5.1 界面布局设计 5.1.1 线性布局 5.1.2 表格布局 5.1.3 帧布局 5.1.4 相对布局 5.1.5 绝对布局 5.1.6 复用XML布局文件 5.2 控制视图界面的其他方法 5.2.1 代码控制视图界面 5.2.2 代码和XML联合控制视图界面 5.3 多界面的使用 5.3.1 使用Intent封装数据 5.3.2 使用Bundle封装数据 5.3.3 获取另一个界面返回结果 5.4 小结 练习 第6章 Android数据存储与共享 6.1 数据存储与共享方式概述 6.2 首选项信息 6.2.1 私有数据存储 6.2.2 公有数据存储与共享 6.3 数据文件 6.3.1 内存数据文件 6.3.2 SD卡数据文件 6.4 SQLite数据库 6.4.1 SQLite基本操作 6.4.2 SQLiteOpenHelper 6.5 Content Provider 6.5.1 使用Content Provider发布数据 6.5.2 使用Content Resolver获取数据 6.6 小结 练习 第7章 多线程及消息处理 7.1 Android多线程概述 7.1.1 创建线程 7.1.2 操作线程 7.2 UI线程与非UI线程 7.3 多线程中的常用类 7.3.1 Handler类 7.3.2 AsyncTask类 7.3.3 Timer定时器 7.4 Android多线程通信机制 7.5 小结 练习 第8章 网络通信 8.1 通过HTTP访问网络 8.1.1 测试用Web服务器 8.1.2 WebView组件 8.1.3 HttpURLConnection 8.2 Socket编程 8.3 数据的解析 8.3.1 JSON数据解析 8.3.2 XML数据解析 8.4 Web Service访问 8.5 小结 练习 第9章 多媒体应用 9.1 音频与视频的播放 9.1.1 MediaPlayer 9.1.2 SoundPool 9.1.3 VideoView 9.1.4 SurfaceView 9.2 摄像头的使用 9.2.1 摄像头意图Intent 9.2.2 Camera类 9.3 小结 练习 实验一 Android开发环境搭建 实验二 界面设计:基本组件 实验三 界面设计:布局管理器 实验四 多线程应用 实验五 基于文件的日程安排 实验六 基于SQLite的通信录 实验七 天气预报应用 实验八 音乐播放器及相机拍摄
如何才能真正进阶为Android应用开发高手?必须深入理解Android核心技术的底层原理和在开发中总结并使用各种最佳实践,别无他法!深入Android应用开发:核心技术解析与最佳实践以Android的源代码为主,SDK为辅,针对应用开发者的需求,对各种核心技术的使用方法、底层原理和实现细节进行了深入而详细的讲解,同时辅之以大量案例和最佳实践,为开发者的进阶修炼和开发高质量的应用提供了绝佳指导。 第1章深入介绍了Android的4大核心组件和9大主要应用框架;第2章透彻讲解了资源、组件、事件处理、应用风格和数据适配等核心知识;第3章系统地展示了各种常用的UI控件的使用方法及原理,并对XML和Java这两种控件属性配置方式和适用场景进行了分析和比较;第4章深入阐述了Android的数据存储与管理;第5章分析了Android在UI层、框架层和内核层的通信机制和原理;第6章深入讲解了Android实现多线程的两种主要方式(原生Java线程和Android对Java线程的封装)的原理,并对它们进行了全方位比较;第7章深入介绍了Android网络编程的核心技术;第8章详细讲解了Android中的2D图像、3D图像、2D图形以及动画方面的知识;第9章全面介绍了Android的多媒体编程,包括音频、视频和Camera服务等,并对TTS的实现进行了剖析;第10章详细讲解了Android的跨语言调用;第11章深入剖析了Android的安全框架和安全机制;第12章针对商业应用的需要讲解了Android调试、测试与性能优化;第13章全面地剖析了Android的编译系统,包括编译工具、映像文件编译、SDK编译、NDK编译和目标系统的配置等;第14章分析了Android系统的启动过程;第15章讲解了Android的系统管理原理,包含内存管理、应用管理、电源管理、系统管理,以及系统的还原、升级、配置和备份等多方面的内容,能帮助开发者从一个更高的视角去理解Android的运行机制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值