Android多媒体学习三:实现自己的Camera
Android自带的Camera应用虽然可以满足大多数情景,但是其灵活性上还有不足。但是Android允许我们定制自己的Camera。
在Android的hardware包中有一个Camera类。这个类就是获取Camera服务的,可以定制Camera等。
可以通过open()方法获取其实例。
在使用这个类是需要在AndroidManifest.xml文件中加入相应的权限和特性
如:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
等。
本文实例:
- package demo.camera;
- import java.io.OutputStream;
- import java.util.Iterator;
- import java.util.List;
- import android.app.Activity;
- import android.content.ContentValues;
- import android.content.res.Configuration;
- import android.hardware.Camera;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.MediaStore;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import android.widget.LinearLayout;
- /**
- * Android自带的Camera应用程序可以完成很多功能。但是当其不能满足我们需要的时候
- * 我们可以定制自己的Camera。Android提供了Camera类来辅助我们实现自己的Camera。
- * 这个例子就来定义一个自己的Camera
- * 首先,在Manifest中需要引入权限<uses-permission android:name="android:permission.CAMERA"/>
- * 我们需要用来存放取景器的容器,这个容器就是SurfaceView。
- * 使用SurfaceView的同时,我们还需要使用到SurfaceHolder,SurfaceHolder相当于一个监听器,可以监听
- * Surface上的变化,通过其内部类CallBack来实现。
- * 为了可以获取图片,我们需要使用Camera的takePicture方法同时我们需要实现Camera.PictureCallBack类,实现onPictureTaken方法
- * @author Administrator
- *
- */
- public class MyCamera extends Activity implements SurfaceHolder.Callback,Camera.PictureCallback{
- public static final int MAX_WIDTH = 200;
- public static final int MAX_HEIGHT = 200;
- private SurfaceView surfaceView;
- private Camera camera; //这个是hardare的Camera对象
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.camera);
- surfaceView = (SurfaceView)this.findViewById(R.id.myCameraView);
- surfaceView.setFocusable(true);
- surfaceView.setFocusableInTouchMode(true);
- surfaceView.setClickable(true);
- surfaceView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- camera.takePicture(null, null, null, MyCamera.this);
- }
- });
- //SurfaceView中的getHolder方法可以获取到一个SurfaceHolder实例
- SurfaceHolder holder = surfaceView.getHolder();
- //为了实现照片预览功能,需要将SurfaceHolder的类型设置为PUSH
- //这样,画图缓存就由Camera类来管理,画图缓存是独立于Surface的
- holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- holder.addCallback(this);
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- // 当Surface被创建的时候,该方法被调用,可以在这里实例化Camera对象
- //同时可以对Camera进行定制
- camera = Camera.open(); //获取Camera实例
- /**
- * Camera对象中含有一个内部类Camera.Parameters.该类可以对Camera的特性进行定制
- * 在Parameters中设置完成后,需要调用Camera.setParameters()方法,相应的设置才会生效
- * 由于不同的设备,Camera的特性是不同的,所以在设置时,需要首先判断设备对应的特性,再加以设置
- * 比如在调用setEffects之前最好先调用getSupportedColorEffects。如果设备不支持颜色特性,那么该方法将
- * 返回一个null
- */
- try {
- Camera.Parameters param = camera.getParameters();
- if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
- //如果是竖屏
- param.set("orientation", "portrait");
- //在2.2以上可以使用
- //camera.setDisplayOrientation(90);
- }else{
- param.set("orientation", "landscape");
- //在2.2以上可以使用
- //camera.setDisplayOrientation(0);
- }
- //首先获取系统设备支持的所有颜色特效,有复合我们的,则设置;否则不设置
- List<String> colorEffects = param.getSupportedColorEffects();
- Iterator<String> colorItor = colorEffects.iterator();
- while(colorItor.hasNext()){
- String currColor = colorItor.next();
- if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){
- param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE);
- break;
- }
- }
- //设置完成需要再次调用setParameter方法才能生效
- camera.setParameters(param);
- camera.setPreviewDisplay(holder);
- /**
- * 在显示了预览后,我们有时候希望限制预览的Size
- * 我们并不是自己指定一个SIze而是指定一个Size,然后
- * 获取系统支持的SIZE,然后选择一个比指定SIZE小且最接近所指定SIZE的一个
- * Camera.Size对象就是该SIZE。
- *
- */
- int bestWidth = 0;
- int bestHeight = 0;
- List<Camera.Size> sizeList = param.getSupportedPreviewSizes();
- //如果sizeList只有一个我们也没有必要做什么了,因为就他一个别无选择
- if(sizeList.size() > 1){
- Iterator<Camera.Size> itor = sizeList.iterator();
- while(itor.hasNext()){
- Camera.Size cur = itor.next();
- if(cur.width > bestWidth && cur.height>bestHeight && cur.width <MAX_WIDTH && cur.height < MAX_HEIGHT){
- bestWidth = cur.width;
- bestHeight = cur.height;
- }
- }
- if(bestWidth != 0 && bestHeight != 0){
- param.setPreviewSize(bestWidth, bestHeight);
- //这里改变了SIze后,我们还要告诉SurfaceView,否则,Surface将不会改变大小,进入Camera的图像将质量很差
- surfaceView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight));
- }
- }
- camera.setParameters(param);
- } catch (Exception e) {
- // 如果出现异常,则释放Camera对象
- camera.release();
- }
- //启动预览功能
- camera.startPreview();
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // 当Surface被销毁的时候,该方法被调用
- //在这里需要释放Camera资源
- camera.stopPreview();
- camera.release();
- }
- @Override
- public void onPictureTaken(byte[] data, Camera camera) {
- // data是一个原始的JPEG图像数据,
- //在这里我们可以存储图片,很显然可以采用MediaStore
- //注意保存图片后,再次调用startPreview()回到预览
- Uri p_w_picpathUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
- try {
- OutputStream os = this.getContentResolver().openOutputStream(p_w_picpathUri);
- os.write(data);
- os.flush();
- os.close();
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- camera.startPreview();
- }
- }
转载于:https://blog.51cto.com/whatandroid/987100
Android多媒体学习三:实现自己的Camera相关推荐
- Android多媒体学习一:Android中Image的简单实例。
在多媒体应用中,Image是最基础的功能模块,接下来我们将看看在Android中是如何获取和存储Image的.Android内嵌的Image获取和存储功能,可以让我们对于整个媒体框架有个比较全面的了解 ...
- Android多媒体学习五:调用Android自带的播放器播放Audio
Android有其自带的播放器,我们可以使用隐式Intent来调用它:通过传入一个Action为ACTION_VIEW同时,指定Data为所要播放的Audio的Uri对象,并指定格式信息,则我们就可以 ...
- Android多媒体学习六:访问网络上的Audio对应的M3U文件,实现网络音频流的播放
Android中提供了对网络上流媒体的支持,我们可以使用MediaPlayer类来播放一个网络上的音频文件. 但是网络上的站点并不建议我们直接访问流,我们需要获取他提供的M3U文件,根据M3U文件来实 ...
- Android多媒体学习八:调用Android自带的音频录制程序,实现录制
Android中有自带的音频录制程序,我们可以通过指定一个Action为MediaStore.Audio.Media.RECORD_SOUND_ACTION的Intent来 启动它就可以了.然后在on ...
- Android 开发学习(三)
文章目录 1. ListView 的 使用 2. RecyclerView 的 使用 (推荐) 3. 动画 3.1 逐帧动画 3.2 补间动画 3.2.1 补间动画 之 alpha透明度 3.2.2 ...
- Android多媒体整体架构图
Android多媒体整体架构图 MediaPlayer框架图 Camera框架图 SoundRecorder框架图 VideoCamera框架图 OpenCore与Skia ALSA Audio框架图 ...
- android多媒体框架学习 详解
原址 一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了! ...
- android多媒体框架学习 详解 最新版本
一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现 ...
- Android开发学习之路--Camera之初体验
顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就能够通过camera来拍照,然后存储照片.发送给好友.那么微信的app里面是不会直接通过camera api来实现的,由于 ...
最新文章
- 设计模式之单例模式(Singleton)摘录
- 小小base标签在web开发中的大作用
- Go 语言框架 Gin 练习2
- 《伊万博士: 进化》利用三角剖分算法复刻《超越光速》地图机制
- 运行jmap时弹出:Usage: jmap [option] <pid> (to connect to running process) jmap [option] <
- 24点游戏c语言源代码6,C语言解24点游戏程序
- java怎么引入html文件路径_如何在public_html中读取文件但在域外?使用相对路径...
- mysql geometry 维度_使用MySQL的geometry类型处理经纬度距离问题的方法
- c#里面的combobox在代码中怎么根据它的text获取它的index?
- linux+echo+权限不够,解决linux echo命令以及linux echo命令提示权限不够的方法
- 51CTO专访:谈谈SOC安全管理平台
- IDEA设置文件模板
- win7 虚拟机安装
- 【Arduino实验15 红外遥控电风扇】
- super是不是java中的标识符_java关键字super和this是什么?有什么区别?
- R语言威尔科克森符号秩和(Wilcoxon Signed Rank statistic)分布
- 电商系统,商品属性表和功能设计,可用于各种实体的属性
- Imperfect C++读书笔记(二):前置条件、后置条件和不变式
- ffmpeg音频滤镜
- 方差分析/卡方/fisher精确检验
热门文章
- 最短路--DijkstraFloyedSPFA
- 【bzoj4994】[Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组
- PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性...
- 【转】蓝牙技术及其系统原理
- 2008技术内幕:T-SQL语言基础 联接查询摘记
- 今天微软关闭Silverlight官网,Sivlerlight真得要死了吗?
- ASP.NET 图片剪辑控件
- Linux 下查看系统是32位 还是64 位的方法
- 杂谈——杭州考驾照历程
- visio 导出无边距的pdf 图