Android Camera(二)
上次已经写过SurfaceView显示Camera摄像了,代码可以运行,但是里面有问题,这次纠正过来,顺便实现变焦:
代码:
- public class CameravedioActivity extends Activity{
- private static final String TAG = "CameravedioActivity";
- private Camera camera;
- private boolean preview = false ;
- private SeekBar mSeekBar;
- private SurfaceView surfaceView;
- private SurfaceHolder surfaceHolder;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- /*
- *设置窗口属性:一定要在 setContentView(R.layout.main) 之前
- */
- // 窗口标题,其实可以在manifes文件里面注册
- // requestWindowFeature(Window.FEATURE_NO_TITLE);
- // 全屏
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.main);
- surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
- surfaceHolder = surfaceView.getHolder();
- surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- surfaceView.getHolder().setFixedSize(200, 200);
- surfaceView.getHolder().addCallback(new SurfaceViewCallback());
- /**
- * seekbar 用来实现变焦逻辑
- */
- mSeekBar = (SeekBar)findViewById(R.id.seekbar);
- mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
- // TODO Auto-generated method stub
- Log.d(TAG, "progress:"+progress);
- // sdk 文档描述 set zoom 之前先check
- if(camera.getParameters().isZoomSupported()){
- Parameters params = camera.getParameters();
- params.setZoom(progress);
- camera.setParameters(params);
- }
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- // TODO Auto-generated method stub
- Log.d(TAG, "onStartTrackingTouch");
- }
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- // TODO Auto-generated method stub
- Log.d(TAG, "onStartTrackingTouch");
- }
- });
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- }
- public static void setCameraDisplayOrientation(Activity activity,
- int cameraId, android.hardware.Camera camera) {
- android.hardware.Camera.CameraInfo info =
- new android.hardware.Camera.CameraInfo();
- android.hardware.Camera.getCameraInfo(cameraId, info);
- int rotation = activity.getWindowManager().getDefaultDisplay()
- .getRotation();
- int degrees = 0;
- Log.d(TAG, "rotation:"+rotation);
- switch (rotation) {
- case Surface.ROTATION_0: degrees = 0; break;
- case Surface.ROTATION_90: degrees = 90; break;
- case Surface.ROTATION_180: degrees = 180; break;
- case Surface.ROTATION_270: degrees = 270; break;
- }
- int result;
- if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
- result = (info.orientation + degrees) % 360;
- result = (360 - result) % 360; // compensate the mirror
- } else { // back-facing
- result = (info.orientation - degrees + 360) % 360;
- }
- camera.setDisplayOrientation(result);
- }
- private final class SurfaceViewCallback implements Callback {
- /**
- * surfaceView 被创建成功后调用此方法
- */
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- Log.d(TAG,"surfaceCreated");
- /*
- * 在SurfaceView创建好之后 打开摄像头
- * 注意是 android.hardware.Camera
- */
- // 2.2获取摄像头number physical cameras
- // api 9: Camera.getNumberOfCameras()
- Log.d(TAG, "numbers:"+Camera.getNumberOfCameras());
- if(Camera.getNumberOfCameras() ==2){
- // 前置摄像头
- // api 9 :Camera.CameraInfo
- camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
- camera.setDisplayOrientation(90);
- }else{
- camera = Camera.open();
- }
- // camera = Camera.open();
- // setCameraDisplayOrientation(CameravedioActivity.this,Camera.CameraInfo.CAMERA_FACING_FRONT,camera);
- Log.d(TAG, "smoothZoom:"+camera.getParameters().isSmoothZoomSupported());
- Log.d(TAG, "supportzoom:"+camera.getParameters().isZoomSupported());
- Log.d(TAG, "max zoom:"+camera.getParameters().getMaxZoom());
- /*
- * This method must be called before startPreview(). otherwise surfaceview没有图像
- */
- try {
- camera.setPreviewDisplay(surfaceHolder);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Camera.Parameters parameters = camera.getParameters();
- /* 每秒从摄像头捕获5帧画面, */
- parameters.setPreviewFrameRate(5);
- /* 设置照片的输出格式:jpg */
- parameters.setPictureFormat(PixelFormat.JPEG);
- /* 照片质量 */
- parameters.set("jpeg-quality", 85);
- mSeekBar.setMax(parameters.getMaxZoom());
- // valid parameters:
- // 取得相机所支持多少图片大小的个数
- List<Size> pszize = parameters.getSupportedPreviewSizes();
- // List<Size> pszize = parameters.getSupportedPictureSizes();
- if (null != pszize && 0 < pszize.size()) {
- int height[] = new int[pszize.size()];// 声明一个数组
- Map<Integer, Integer> map = new HashMap<Integer, Integer>();
- for (int i = 0; i < pszize.size(); i++) {
- Size size = (Size) pszize.get(i);
- int sizeheight = size.height;
- int sizewidth = size.width;
- height[i] = sizeheight;
- map.put(sizeheight, sizewidth);
- Log.d(TAG, "size.width:"+sizewidth+"\tsize.height:"+sizeheight);
- }
- Arrays.sort(height);
- // 设置
- // parameters.setPictureSize(map.get(height[0]),height[0]);
- parameters.setPreviewSize(map.get(height[0]),height[0]);
- }
- /* 将参数对象赋予到 camera 对象上 */
- camera.setParameters(parameters);
- camera.startPreview();
- /**
- * Installs a callback to be invoked for every preview frame in addition to displaying them on the screen.
- * The callback will be repeatedly called for as long as preview is active. This method can be called at
- * any time, even while preview is live. Any other preview callbacks are overridden.
- * a callback object that receives a copy of each preview frame, or null to stop receiving
- */
- camera.setPreviewCallback(new Camera.PreviewCallback(){
- @Override
- public void onPreviewFrame(byte[] data, Camera camera) {
- // TODO Auto-generated method stub
- //在视频聊天中,这里传送本地frame数据给remote端
- // Log.d(TAG, "camera:"+camera);
- // Log.d(TAG, "byte:"+data);
- }
- });
- preview = true;
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- Log.d(TAG,"surfaceChanged");
- }
- /**
- * SurfaceView 被销毁时释放掉 摄像头
- */
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- if(camera != null) {
- /* 若摄像头正在工作,先停止它 */
- if(preview) {
- camera.stopPreview();
- preview = false;
- }
- //如果注册了此回调,在release之前调用,否则release之后还回调,crash
- camera.setPreviewCallback(null);
- camera.release();
- }
- }
- }
- }
注册文件:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.edu.wtu"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <!-- android:screenOrientation="landscape" 表示横向界面 -->
- <activity android:name=".CameravedioActivity" android:label="@string/app_name" android:screenOrientation="portrait">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="7" />
- <!-- 在SDCard中创建与删除文件权限 -->
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <!-- 往SDCard写入数据权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <!-- 申请使用摄像头的权限 -->
- <uses-permission android:name="android.permission.CAMERA"/>
- </manifest>
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- >
- <SurfaceView
- android:id="@+id/surfaceView"
- android:layout_width="200dip"
- android:layout_height="150dip"
- android:layout_gravity="center"
- android:visibility="visible"
- />
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- <SeekBar
- android:id="@+id/seekbar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="40dip"
- android:layout_marginRight="40dip"
- android:layout_gravity="center"
- android:progressDrawable="@android:color/transparent"
- android:background="@drawable/progressbar_box"
- />
- </LinearLayout>
- </LinearLayout>
- </FrameLayout>
seekbar用来实现调焦的
Android Camera(二)的更多相关文章
- 【转】android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
关键词:android camera CMM 模组 camera参数 CAMIF平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者 ...
- android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
一.摄像头工作原理 上一篇我们讲了摄像头模组的组成,工作原理,做为一种了解.下面我们析摄像头从寄存器角度是怎么工作的.如何阅读摄像头规格书(针对驱动调节时用到关键参数,以GT2005为例). 规格书, ...
- 【转】android camera(四):camera 驱动 GT2005
关键词:android camera CMM 模组 camera参数 GT2005 摄像头常见问题 平台信息: 内核:linux系统:android 平台:S5PV310(samsung exyn ...
- 【转】android camera(三):camera V4L2 FIMC
关键词:android camera CMM 模组 camera参数 CAMIF V4L2 平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos ...
- 【转】android camera(一):camera模组CMM介绍
关键词:android camera CMM 模组 camera参数平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者:xubin ...
- android camera(一):camera模组CMM介绍【转】
转自:https://blog.csdn.net/kevinx_xu/article/details/8821818 androidcmm图像处理工作手机三星 关键词:android camera ...
- Android Camera系列开发 (二)通过Intent录制视频
Android Camera系列开发 (二)通过Intent录制视频 作者:雨水 2013-8-18 CSDN博客:http://blog.csdn.net/gobitan/ 概述 使用Camera ...
- Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。
源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机 ...
- Android Camera 使用小结
Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Inten ...
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...
随机推荐
- AnimatorController动画遮罩
游戏中,我们的人物在某些时候,可能在一个时间点在做两件事,这样就需要同时播放两个动画,但我们肯定不能简单将其叠加,比如移动着开枪.攻击.挥手等等,那么在Unity中我们应该怎样实现这样的功能呢?且听我 ...
- Java comparable 和 comparator
一.comparator 接口继承 public class ComparatorTest { /** * @param args */ public static void main(String[ ...
- Unlocker(强力删除文件工具) 1.9.2 汉化绿色版
软件名称: Unlocker(强力删除文件工具) 1.9.2 汉化绿色版软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 5 ...
- Jquery EasyUI datagrid后台数据表格生成及分页详解
由于项目原因,网站后台需要对用户信息进行各种操作,有时还需要进行批量操作,所以首先需要将用户信息展示出来,查了不少资料.发现Jquery EasyUI确实是一个不错的选择,功能强大,文档也比较全面,而 ...
- mysql 准则 杂谈
转自 刘智慧的文章 1.尽量不要在数据库做运算,复杂运算移到程序段cpu,竟可能简单运用mysql 2.控制单表数据量, 库表控制300---400,单表字段控制20---50个,单表1G或500W行 ...
- Robotium第一天:搭建环境测试微信
因为要在命令行下运行一些android的工具,所以配置一些环境变量会比较方便: 遇到问题: java -jar re-sign.jar 出现提示android路径没有配置好: 需要配置如下: 配置AN ...
- java发布项目后注意小点,以及对于金额在java中的处理
项目在发布之后,有时会进行一些小的地方的修改,特别是对于一些常量的修改,如定义的一些特殊账户,第三方的key值,当修改的时候,我之前就偷懒过,因为项目在服务器上面,访问速度也受到限制,替换整个项目很麻 ...
- <context:annotation-config> 和 <context:component-scan>的区别
转自:GOOD spring <context:annotation-config> 跟 <context:component-scan>诠释及区别 <context:a ...
- 关于Unicode字符集
最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符.显然,这样要表示各种语言中所有的字符是远远不够的.Unicode4.0规范考虑到了这种情况 ...
- hdu_5750_Dertouzos(线性筛)
题目连接:hdu_5750_Dertouzos 题意: 给你一个n,一个d,问你比n小的数中有多少个数的最大的因子为d,比如6有因子1 2 3 最大的为3 题解: 当时比赛做这题的时候没考虑常数的优化 ...