构建定制的camera
来源:互联网 发布:winsteel软件下载 编辑:程序博客网 时间:2024/05/17 01:23
定制一个Camera
1.权限:
<uses-permission android:name="android.permission.CAMERA"/>
2.预览布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.media.MyCameraActivity" > <SurfaceView android:id="@+id/sf_camera" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
3.初始化:
sf_suface = (SurfaceView) findViewById(R.id.sf_camera);sf_holder = sf_suface.getHolder();sf_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//推送类型
4 实现SurfaceHolder.Callback接口重写:
@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}@Overridepublic void surfaceCreated(SurfaceHolder arg0) {}@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {}5.告诉SurfaceHolder实现Callback
sf_holder.addCallback(this);
6.实现Camera对象
@Overridepublic void surfaceCreated(SurfaceHolder arg0) {camera = Camera.open();}7.显示并启动Camera
@Overridepublic void surfaceCreated(SurfaceHolder arg0) {camera = Camera.open();try {camera.setPreviewDisplay(sf_holder);} catch (IOException e) {camera.release();e.printStackTrace();}camera.startPreview();}8.记得释放camera
@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {camera.stopPreview();camera.release();}
运行截图:
发现有些奇怪逆时针旋转了90度 ,切换横屏发现在横屏状态下是正确的。
1需要旋转:
@Overridepublic void surfaceCreated(SurfaceHolder arg0) {camera = Camera.open();try {Camera.Parameters parameters = camera.getParameters();//竖屏if(this.getResources().getConfiguration().orientation!=Configuration.ORIENTATION_LANDSCAPE){parameters.set("orientation", "portrait");camera.setDisplayOrientation(90);parameters.setRotation(90);}else{parameters.set("orientation", "landscape");camera.setDisplayOrientation(0);parameters.setRotation(0);}camera.setParameters(parameters);camera.setPreviewDisplay(sf_holder);} catch (IOException e) {camera.release();e.printStackTrace();}camera.startPreview();}
这样就正常了。
Parameters 还有很多有趣的参数 可以自己测试一下。
这里的模式一定需要Camera支持
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);//聚焦模式 parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);//闪光灯模式 parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);//情景模式 parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);//白平衡模式 parameters.setAntibanding(Camera.Parameters.ANTIBANDING_AUTO);//抗条带 //各种效果 List<String> colorEffects = parameters.getSupportedColorEffects(); Iterator<String> cEffects = colorEffects.iterator(); while(cEffects.hasNext()){ String colorEffect = cEffects.next(); if(colorEffect.equals(Camera.Parameters.EFFECT_NEGATIVE)){ parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);//照片特效模式 break; } }
更改摄像头预览大小:
这里不指定一个确定的值,选择不超过一对常量的大小:
private static final int width = 300;private static final int heigth = 300;
代码:
@Overridepublic void surfaceCreated(SurfaceHolder arg0) {camera = Camera.open();int mwidth = 0;int mheight = 0;try {Camera.Parameters parameters = camera.getParameters();// 竖屏if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {parameters.set("orientation", "portrait");camera.setDisplayOrientation(90);parameters.setRotation(90);} else {parameters.set("orientation", "landscape");camera.setDisplayOrientation(0);parameters.setRotation(0);}//屏幕大小List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();if(sizes.size()>1){Iterator<Camera.Size> iterator = sizes.iterator();while (iterator.hasNext()) {Camera.Size size = iterator.next();if(size.width>mwidth&&size.width<=width&&size.height>mheight&&size.height<=heigth){ mwidth = size.width;mheight =size.height;}}}if(mwidth!=0&&mheight!=0){parameters.setPictureSize(mwidth, mheight); sf_camera.setLayoutParams(new LinearLayout.LayoutParams(mwidth, mheight)); }camera.setParameters(parameters);camera.setPreviewDisplay(sf_holder);} catch (IOException e) {camera.release();e.printStackTrace();}camera.startPreview();}
保存图片实现PictureCallback:
@Overridepublic void onPictureTaken(byte[] data, Camera camera) {}
@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//向MeidaStore插入一条记录Uri imageUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());try {OutputStream ops = getContentResolver().openOutputStream(imageUri);ops.write(data);ops.flush();ops.close();} catch (Exception e) {e.printStackTrace();}}
记得更新数据源
//更新记录标题和描述private void updatecontentValues(Uri imageUri){ContentValues contentValues = new ContentValues(3);contentValues.put(Media.DISPLAY_NAME, "this is test update title");contentValues.put(Media.DESCRIPTION, "this is test update des");getContentResolver().update(imageUri, contentValues, null, null);}
最后获取图片:
初始化 实现OnClickListener
sf_camera.setFocusable(true);sf_camera.setFocusableInTouchMode(true);sf_camera.setClickable(true);sf_camera.setOnClickListener(this);
获取图:
@Overridepublic void onClick(View v) {camera.takePicture(null, null, null,this);}
0 0
- 构建定制的camera
- 构建自己的Camera应用程序
- 构建自定义的Camera应用程序
- Android开发:定制自己的Camera
- Android开发:定制自己的Camera
- Android中定制自己的Camera
- 构建基于dingshiq的Camera应用程序
- maven定制化构建
- 为受数据驱动的 Web 站点构建定制模板
- 为受数据驱动的 Web 站点构建定制模板
- 构建与定制:唯品会PaaS基于Kubernetes的实践
- DEV XtraReport 动态构建报表之设计器的定制
- 基于Android--------以OpenCV的JavaCameraView为例,定制自己的Camera
- (四) Basic Build Customization(基本的构建定制 :签名,构建,混淆)
- 4.2 显示Camera应用---定制二
- Maven Profile定制化构建
- 译文:构建DataGridView的定制NumericUpDown单元格(Cell)和表格列(Column)
- 网站案例使用 Sails.js 构建和定制企业级的 Node.js 应用
- 解决opengl加载3ds模型只有一张贴图的办法!!!!
- linux下安装R
- 制作自定义背景Button按钮、自定义形状Button的全攻略
- ubuntu14.04下vnc的安装
- i2c协议
- 构建定制的camera
- asp.net课程设计——物流信息供求网
- 第九周项目二我的数组类
- JavaScript入门
- glclear glclearcolor小记
- Android-仿微信菜单
- 匈牙利算法和hopcroft_karp算法模板
- HttpURLConnection
- Android初级教程之内容提供者获取联系人信息