一.camera启动
1.一个activity启动调用流程:
onCreate()-->onStart()-->onResume()
onCreate():
1.可添加所需布局文件,画界面。
2.开启线程,启动硬件摄像头,调用CameraHolder.instance().open()得到一个android.hardwareCamera实例mCameraDevice
ensureCameraDevice()-->CameraHolder.instance().open()-->mCameraDevice.getParameters();确保摄像头存在,并将摄像头打开。
startPreview();开始取景预览
3.创建 VideoPreview 的SurfaceHolder,同时注册callback函数,当VideoPreview的长宽变化时,调用SurfaceChanged()函数
mSurfaceView = (SurfaceView) findViewById(R.id.camera_preview);
SurfaceHolder holder = mSurfaceView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
4.mIsImageCaptureIntent是否为从短信息或联系人编辑界面发送的intent到camera
mIsImageCaptureIntent = isImageCaptureIntent();当该函数返回true时,表示从短信息或联系人界面跳转到拍照界面;
为false时,表示从桌面程序正常启动camera;要注意两种不同情况所需的右侧界面功能按钮区有变动。
onStart():
1.mSwitcher.setSwitch(SWITCH_CAMERA)设置拍照录像切换按钮切换到照相模式。
onResume()
startPreview()重新开始预览
1.当按home键退出程序时,会掉用stopPreview(),故再次进入时,会执行onResume()函数,在此函数中,应重新开启预览功能。
2.keepScreenOnAwhile()点亮屏幕,防止屏幕变黑。
2.拍照录像切换功能
1.Switcher继承自ImageView,在布局文件中直接布局即可
2.mSwitch为true时,滑块在下方,显示拍照界面;当mSwitch为false时,滑块在上方,显示录像界面。
3.当点击或触碰拍照录像切换按钮时:
MotionEvent.ACTION_UP-->tryToSetSwitch()-->mListener.onSwitchChanged(this, onOff)
在camera.java中实现该接口,调用switchToVideoMode()-->MenuHelper.gotoVideoMode(this)-->startCameraActivity(),并结束当前程序。
3.updateThumbnailButton()更新功能按钮去的到相簿按钮
1.调用事件:
initializeFirstTime初始化时调用
initializeSecondTime()时调用
Intent.ACTION_MEDIA_SCANNER_FINISHED,扫描SD卡结束时调用
2.mThumbController.isUriValid(),当图库里有图片时,值为TRUE;当图库里无图片时,值为FALSE。
3.updateLastImage()更新到相簿按钮上的显示图片。
4.mThumbController.updateDisplayIfNeeded()-->if (mUri == null) mButton.setImageDrawable(null);当图库无照片时,此处不显示任何照片。
4.shutterButton拍照按钮
1.对焦调用流程
按下屏幕上的ShutterButton 按钮。
ShutterButton.java中的监听线程 调用callShutterButtonFocus(),这个函数会调用接口ShutterButton.OnShutterButtonListener 的函数onShutterButtonFocus()。
Camera.java实现了接口ShutterButton.OnShutterButtonListener。故Camera.java中的函数onShutterButtonFocus()被调用。
接着的执行流程为-----> doFocus()------>autoFocus()--->mCameraDevice.autoFocus()
2.拍照调用流程
之后ShutterButton.java调用performClick(),这个函数中调用了Camera.java中的onShutterButtonClick()
接着的执行流程为 ----->dosnap()----->ImagePicture.onSnap()----->ImageCapture.initiate()---->ImageCapture.capture() 此函数执行完后,takepicture 过程完成
takePicture 完成后,surfaceChanged()将被调用将刚照下的照片显示在屏幕上。
Camera.java中的回调接口JpegPictureCallback中的函数onPictureTaken()接着执行。这个函数先调用ImageCapture.storeImage()将jpeg图像数据存储在内存。
3.picture 的thumbnail显示过程:
ImageCapture.storeImage()--->ImageCapture.setLastPictureThumb()---> mThumbController.setData(uri, lastPictureThumb);
5.布局文件
1.attach_camera_control.xml,当从短信息或联系人界面,进入camera时,右侧功能按钮区的“确定” “重拍”及“取消”
2.camera_control.xml,camera和videocamera主界面右侧的功能按钮区的布局
3.camera.xml,camera主界面左侧预览取景区的布局
4.video_camera.xml,videocamera主界面左侧预览取景区的布局
5.on_screen_hint.xml,SD卡相关信息的输出,如在屏幕下方提示“使用相机前请先插入 SD 卡。”
6.照相机SD卡
1.BroadcastReceiver mReceiver,接受SD卡发出的状态变化消息。
2.Intent.ACTION_MEDIA_MOUNTED 挂在
Intent.ACTION_MEDIA_UNMOUNTED 未挂在
Intent.ACTION_MEDIA_CHECKING SD卡从未插入到插入的过程中会调用此状态
Intent.ACTION_MEDIA_SCANNER_FINISHED 扫描SD卡结束,即SD卡进入可使用状态
3.checkStorage()->calculatePicturesRemaining()->MenuHelper.calculatePicturesRemaining()计算SD卡剩余空间
4.updateStorageHint()更新界面提示显示文字
其中MenuHelper.NO_STORAGE_ERROR包含SD卡状态:MEDIA_CHECKING,MEDIA_SHARED,等SD卡被移除状态
state = Environment.getExternalStorageState()获取SD卡状态
如state.equals(Environment.MEDIA_CHECKING)表示SD卡正在准备中
mStorageHint = OnScreenHint.makeText(this, noStorageText);设置当前界面需显示的内容
mStorageHint.show();显示SD卡状态文字
7. 摄像机SD卡,比照相机稍微麻烦一些
1.onResume()函数中注册receive事件
IntentFilter intentFilter =
new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addDataScheme("file");
mReceiver = new MyBroadcastReceiver();
registerReceiver(mReceiver, intentFilter);
mStorageStatus = getStorageStatus(true);
2.class MyBroadcastReceiver处理接收到的如上注册事件
比如其中
if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
updateAndShowStorageHint(false);
stopVideoRecording();
}在当拔出SD卡是触发
3.updateAndShowStorageHint()->getStorageStatus()
此处 当remaining == NO_STORAGE_ERROR,可添加如SHARE,CHECKING等状态的处理
根据不同的状态,返回不同的值
例如:
if (state.equals(Environment.MEDIA_CHECKING)) {
return STORAGE_STATUS_PREPARE;
}else if(state.equals(Environment.MEDIA_SHARED)){
return STORAGE_STATUS_SHARE;
}else {
return STORAGE_STATUS_NONE;
}
当然,所填家的事件需要在1.2步骤中进行注册并调用此函数
4.showStorageHint()
在switch (mStorageStatus)处理所需显示信息
例如,添加如下case语句,处理如上添加的SHARE状态
case STORAGE_STATUS_SHARE:
errorMessage = getString(R.string.sdcard_busy_message);
break;
5.mStorageHint = OnScreenHint.makeText(this, errorMessage);设置所需显示文字内容
6.mStorageHint.show();显示在当前摄像机界面中
8.取景预览去右侧设置条
1.在oncreat()或者xml文件中,我们找不到设置项对应的布局,那么设置项是在什么地方添加的呢?
changeHeadUpDisplayState()该函数即位添加此布局的入口。
2.res/xml/camera_preferences.xml
其相应的图片及文字值位于该xml文件下
分享到:
相关推荐
android-camera-streaming,摄像机流(http-mjpeg),dsp处理,viola-jones人脸检测。.zip
Android-IP-Camera-master 带摄像头手机的普及和手机的移动性表明将手机用于视频监控是可行而且便利的,可以用于没有安装视频监控系统的场所,或者临时需要搭建一个监控环境的场合,比如仓库防火、金铺防盗、刑侦...
Android Hidden Camera What is this library for? This library allows application to take the picture using the device camera without showing the preview of it. Any application can capture the image ...
[Android游戏源码]-camera+etc坦克大战
android-Camera2Basic-master
android-Camera2Basic-master源码,是一个很不错的Android源码,有兴趣的伙伴们抽时间可以看一下把。
EZCam is an Android library that simplifies the use of Camera 2 API for a basic usage. Dependencie Add the following line in your gradle dependencies : compile 'me.aflak.libraries:ezcam:X.X' Or if you...
安卓Android源码——ipcamera-for-android 手机变成IP Camera.zip
android-camera-app.7z
Android-Camera-架构及应用简析
自己总结的Android Camera系统架构及源码分析,以framework和hal为主。
Android中使用surfaceview开发的Camera相机,内容含有注释,非常清楚
也可以自行下载编译。 https://github.com/quantum6/Android-USB-OTG-Camera
一个关于Android-IP-Camera的Demo,通过获取Camera的数据编码传输到Server端。
android4.0照相机源码camera源码
Android-Camera-Example
android 照相机源码 Camera源码
android的相机(android——camera)代码,这是一个完成的工程,用Eclipse导入即可编译使用。
Android Camera2Basic Sample This sample demonstrates how to use basic functionalities of Camera2 API. You can learn how to iterate through characteristics of all the cameras attached to the device, ...
Unity3D 摄像机脚本,支持围绕目标观看,设定局部位置观看,初始化到指定视角。