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" />
等。

本文实例:

  1. package demo.camera;
  2. import java.io.OutputStream;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import android.app.Activity;
  6. import android.content.ContentValues;
  7. import android.content.res.Configuration;
  8. import android.hardware.Camera;
  9. import android.net.Uri;
  10. import android.os.Bundle;
  11. import android.provider.MediaStore;
  12. import android.view.SurfaceHolder;
  13. import android.view.SurfaceView;
  14. import android.view.View;
  15. import android.widget.LinearLayout;
  16. /**
  17. * Android自带的Camera应用程序可以完成很多功能。但是当其不能满足我们需要的时候
  18. * 我们可以定制自己的Camera。Android提供了Camera类来辅助我们实现自己的Camera。
  19. * 这个例子就来定义一个自己的Camera
  20. * 首先,在Manifest中需要引入权限<uses-permission android:name="android:permission.CAMERA"/>
  21. * 我们需要用来存放取景器的容器,这个容器就是SurfaceView。
  22. * 使用SurfaceView的同时,我们还需要使用到SurfaceHolder,SurfaceHolder相当于一个监听器,可以监听
  23. * Surface上的变化,通过其内部类CallBack来实现。
  24. * 为了可以获取图片,我们需要使用Camera的takePicture方法同时我们需要实现Camera.PictureCallBack类,实现onPictureTaken方法
  25. * @author Administrator
  26. *
  27. */
  28. public class MyCamera extends Activity implements SurfaceHolder.Callback,Camera.PictureCallback{
  29. public static final int MAX_WIDTH = 200;
  30. public static final int MAX_HEIGHT = 200;
  31. private SurfaceView surfaceView;
  32. private Camera camera; //这个是hardare的Camera对象
  33. public void onCreate(Bundle savedInstanceState){
  34. super.onCreate(savedInstanceState);
  35. this.setContentView(R.layout.camera);
  36. surfaceView = (SurfaceView)this.findViewById(R.id.myCameraView);
  37. surfaceView.setFocusable(true);
  38. surfaceView.setFocusableInTouchMode(true);
  39. surfaceView.setClickable(true);
  40. surfaceView.setOnClickListener(new View.OnClickListener() {
  41. @Override
  42. public void onClick(View v) {
  43. camera.takePicture(null, null, null, MyCamera.this);
  44. }
  45. });
  46. //SurfaceView中的getHolder方法可以获取到一个SurfaceHolder实例
  47. SurfaceHolder holder = surfaceView.getHolder();
  48. //为了实现照片预览功能,需要将SurfaceHolder的类型设置为PUSH
  49. //这样,画图缓存就由Camera类来管理,画图缓存是独立于Surface的
  50. holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  51. holder.addCallback(this);
  52. }
  53. @Override
  54. public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  55. }
  56. @Override
  57. public void surfaceCreated(SurfaceHolder holder) {
  58. // 当Surface被创建的时候,该方法被调用,可以在这里实例化Camera对象
  59. //同时可以对Camera进行定制
  60. camera = Camera.open(); //获取Camera实例
  61. /**
  62. * Camera对象中含有一个内部类Camera.Parameters.该类可以对Camera的特性进行定制
  63. * 在Parameters中设置完成后,需要调用Camera.setParameters()方法,相应的设置才会生效
  64. * 由于不同的设备,Camera的特性是不同的,所以在设置时,需要首先判断设备对应的特性,再加以设置
  65. * 比如在调用setEffects之前最好先调用getSupportedColorEffects。如果设备不支持颜色特性,那么该方法将
  66. * 返回一个null
  67. */
  68. try {
  69. Camera.Parameters param = camera.getParameters();
  70. if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
  71. //如果是竖屏
  72. param.set("orientation", "portrait");
  73. //在2.2以上可以使用
  74. //camera.setDisplayOrientation(90);
  75. }else{
  76. param.set("orientation", "landscape");
  77. //在2.2以上可以使用
  78. //camera.setDisplayOrientation(0);
  79. }
  80. //首先获取系统设备支持的所有颜色特效,有复合我们的,则设置;否则不设置
  81. List<String> colorEffects = param.getSupportedColorEffects();
  82. Iterator<String> colorItor = colorEffects.iterator();
  83. while(colorItor.hasNext()){
  84. String currColor = colorItor.next();
  85. if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){
  86. param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE);
  87. break;
  88. }
  89. }
  90. //设置完成需要再次调用setParameter方法才能生效
  91. camera.setParameters(param);
  92. camera.setPreviewDisplay(holder);
  93. /**
  94. * 在显示了预览后,我们有时候希望限制预览的Size
  95. * 我们并不是自己指定一个SIze而是指定一个Size,然后
  96. * 获取系统支持的SIZE,然后选择一个比指定SIZE小且最接近所指定SIZE的一个
  97. * Camera.Size对象就是该SIZE。
  98. *
  99. */
  100. int bestWidth = 0;
  101. int bestHeight = 0;
  102. List<Camera.Size> sizeList = param.getSupportedPreviewSizes();
  103. //如果sizeList只有一个我们也没有必要做什么了,因为就他一个别无选择
  104. if(sizeList.size() > 1){
  105. Iterator<Camera.Size> itor = sizeList.iterator();
  106. while(itor.hasNext()){
  107. Camera.Size cur = itor.next();
  108. if(cur.width > bestWidth && cur.height>bestHeight && cur.width <MAX_WIDTH && cur.height < MAX_HEIGHT){
  109. bestWidth = cur.width;
  110. bestHeight = cur.height;
  111. }
  112. }
  113. if(bestWidth != 0 && bestHeight != 0){
  114. param.setPreviewSize(bestWidth, bestHeight);
  115. //这里改变了SIze后,我们还要告诉SurfaceView,否则,Surface将不会改变大小,进入Camera的图像将质量很差
  116. surfaceView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight));
  117. }
  118. }
  119. camera.setParameters(param);
  120. } catch (Exception e) {
  121. // 如果出现异常,则释放Camera对象
  122. camera.release();
  123. }
  124. //启动预览功能
  125. camera.startPreview();
  126. }
  127. @Override
  128. public void surfaceDestroyed(SurfaceHolder holder) {
  129. // 当Surface被销毁的时候,该方法被调用
  130. //在这里需要释放Camera资源
  131. camera.stopPreview();
  132. camera.release();
  133. }
  134. @Override
  135. public void onPictureTaken(byte[] data, Camera camera) {
  136. // data是一个原始的JPEG图像数据,
  137. //在这里我们可以存储图片,很显然可以采用MediaStore
  138. //注意保存图片后,再次调用startPreview()回到预览
  139. Uri p_w_picpathUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
  140. try {
  141. OutputStream os = this.getContentResolver().openOutputStream(p_w_picpathUri);
  142. os.write(data);
  143. os.flush();
  144. os.close();
  145. } catch (Exception e) {
  146. // TODO: handle exception
  147. e.printStackTrace();
  148. }
  149. camera.startPreview();
  150. }
  151. }

转载于:https://blog.51cto.com/whatandroid/987100

Android多媒体学习三:实现自己的Camera相关推荐

  1. Android多媒体学习一:Android中Image的简单实例。

    在多媒体应用中,Image是最基础的功能模块,接下来我们将看看在Android中是如何获取和存储Image的.Android内嵌的Image获取和存储功能,可以让我们对于整个媒体框架有个比较全面的了解 ...

  2. Android多媒体学习五:调用Android自带的播放器播放Audio

    Android有其自带的播放器,我们可以使用隐式Intent来调用它:通过传入一个Action为ACTION_VIEW同时,指定Data为所要播放的Audio的Uri对象,并指定格式信息,则我们就可以 ...

  3. Android多媒体学习六:访问网络上的Audio对应的M3U文件,实现网络音频流的播放

    Android中提供了对网络上流媒体的支持,我们可以使用MediaPlayer类来播放一个网络上的音频文件. 但是网络上的站点并不建议我们直接访问流,我们需要获取他提供的M3U文件,根据M3U文件来实 ...

  4. Android多媒体学习八:调用Android自带的音频录制程序,实现录制

    Android中有自带的音频录制程序,我们可以通过指定一个Action为MediaStore.Audio.Media.RECORD_SOUND_ACTION的Intent来 启动它就可以了.然后在on ...

  5. Android 开发学习(三)

    文章目录 1. ListView 的 使用 2. RecyclerView 的 使用 (推荐) 3. 动画 3.1 逐帧动画 3.2 补间动画 3.2.1 补间动画 之 alpha透明度 3.2.2 ...

  6. Android多媒体整体架构图

    Android多媒体整体架构图 MediaPlayer框架图 Camera框架图 SoundRecorder框架图 VideoCamera框架图 OpenCore与Skia ALSA Audio框架图 ...

  7. android多媒体框架学习 详解

    原址 一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了! ...

  8. android多媒体框架学习 详解 最新版本

    一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现 ...

  9. Android开发学习之路--Camera之初体验

    顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就能够通过camera来拍照,然后存储照片.发送给好友.那么微信的app里面是不会直接通过camera api来实现的,由于 ...

最新文章

  1. 设计模式之单例模式(Singleton)摘录
  2. 小小base标签在web开发中的大作用
  3. Go 语言框架 Gin 练习2
  4. 《伊万博士: 进化》利用三角剖分算法复刻《超越光速》地图机制
  5. 运行jmap时弹出:Usage: jmap [option] <pid> (to connect to running process) jmap [option] <
  6. 24点游戏c语言源代码6,C语言解24点游戏程序
  7. java怎么引入html文件路径_如何在public_html中读取文件但在域外?使用相对路径...
  8. mysql geometry 维度_使用MySQL的geometry类型处理经纬度距离问题的方法
  9. c#里面的combobox在代码中怎么根据它的text获取它的index?
  10. linux+echo+权限不够,解决linux echo命令以及linux echo命令提示权限不够的方法
  11. 51CTO专访:谈谈SOC安全管理平台
  12. IDEA设置文件模板
  13. win7 虚拟机安装
  14. 【Arduino实验15 红外遥控电风扇】
  15. super是不是java中的标识符_java关键字super和this是什么?有什么区别?
  16. R语言威尔科克森符号秩和(Wilcoxon Signed Rank statistic)分布
  17. 电商系统,商品属性表和功能设计,可用于各种实体的属性
  18. Imperfect C++读书笔记(二):前置条件、后置条件和不变式
  19. ffmpeg音频滤镜
  20. 方差分析/卡方/fisher精确检验

热门文章

  1. 最短路--DijkstraFloyedSPFA
  2. 【bzoj4994】[Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组
  3. PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性...
  4. 【转】蓝牙技术及其系统原理
  5. 2008技术内幕:T-SQL语言基础 联接查询摘记
  6. 今天微软关闭Silverlight官网,Sivlerlight真得要死了吗?
  7. ASP.NET 图片剪辑控件
  8. Linux 下查看系统是32位 还是64 位的方法
  9. 杂谈——杭州考驾照历程
  10. visio 导出无边距的pdf 图