AndroidManifest.xml

  1. <uses-feature android:name="android.hardware.camera"/>
  2. <uses-feature android:name="android.hardware.camera.autofocus" />
  3. <uses-permission android:name="android.permission.CAMERA" />
  4. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/LinearLayout1"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".MainActivity" >
  8.  
  9. <Button
  10. android:id="@+id/btn_camera"
  11. android:layout_width="fill_parent"
  12. android:layout_height="wrap_content"
  13. android:text="Camera" />
  14.  
  15. <SurfaceView
  16. android:id="@+id/mySurfaceView"
  17. android:layout_width="fill_parent"
  18. android:layout_height="fill_parent"
  19. />
  20. </LinearLayout>

MainActivity.java

  1. public class MainActivity extends Activity {
  2. private Button btnCamera=null;
  3. private SurfaceView mySurfaceView =null;
  4. private Camera cam=null;
  5. private SurfaceHolder holder=null;
  6. private boolean previewRunning=false;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. this.btnCamera=(Button)super.findViewById(R.id.btn_camera);
  12. this.mySurfaceView=(SurfaceView)super.findViewById(R.id.mySurfaceView);
  13. this.btnCamera.setOnClickListener(new OnClickListenerImpl());
  14. this.holder=this.mySurfaceView.getHolder();
  15. this.holder.addCallback(new MySurfaceViewCallback());
  16. this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  17. this.holder.setFixedSize(800, 480);
  18. }
  19. private class OnClickListenerImpl implements OnClickListener{
  20.  
  21. @Override
  22. public void onClick(View v) {
  23. // TODO Auto-generated method stub
  24. if(MainActivity.this.cam!=null){
  25. MainActivity.this.cam.autoFocus(new AutoFocusCallbackImpl());
  26. }
  27. }
  28.  
  29. }
  30.  
  31. private class MySurfaceViewCallback implements SurfaceHolder.Callback {
  32.  
  33. @Override
  34. public void surfaceChanged(SurfaceHolder holder, int format, int width,
  35. int height) {
  36. // TODO Auto-generated method stub
  37.  
  38. }
  39.  
  40. @Override
  41. public void surfaceCreated(SurfaceHolder holder) {
  42. // TODO Auto-generated method stub
  43. MainActivity.this.cam=Camera.open(); //取第一个摄像头
  44. WindowManager manager=(WindowManager)MainActivity.this.getSystemService(Context.WINDOW_SERVICE);
  45. Display display=manager.getDefaultDisplay();
  46. Parameters param=MainActivity.this.cam.getParameters();
  47. param.setPreviewSize(display.getWidth(), display.getHeight());
  48. param.setPreviewFrameRate(5);//一秒5帧
  49. param.setPictureFormat(PixelFormat.JPEG);
  50. param.set("jpeg-quality", 80);
  51. MainActivity.this.cam.setParameters(param);
  52. try {
  53. MainActivity.this.cam.setPreviewDisplay(MainActivity.this.holder);
  54. } catch (IOException e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. }
  58. MainActivity.this.cam.startPreview();//预览
  59. MainActivity.this.previewRunning=true;
  60. }
  61.  
  62. @Override
  63. public void surfaceDestroyed(SurfaceHolder holder) {
  64. // TODO Auto-generated method stub
  65. if(MainActivity.this.cam!=null){
  66. if(MainActivity.this.previewRunning){
  67. MainActivity.this.cam.stopPreview();
  68. MainActivity.this.previewRunning=false;
  69. }
  70. MainActivity.this.cam.release();//释放摄像头
  71. }
  72. }
  73. }
  74. private class AutoFocusCallbackImpl implements AutoFocusCallback{
  75.  
  76. @Override
  77. public void onAutoFocus(boolean success, Camera camera) {
  78. // 对焦操作
  79. if(success){
  80. MainActivity.this.cam.takePicture(sc, pc, jpegcall);
  81. }
  82. }
  83.  
  84. }
  85. private PictureCallback jpegcall=new PictureCallback() {
  86.  
  87. @Override
  88. public void onPictureTaken(byte[] data, Camera camera) {
  89. // 保存图片操作
  90. Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
  91. String fileName=Environment.getExternalStorageDirectory().toString()
  92. +File.separator
  93. +"AppTest"
  94. +File.separator
  95. +"PicTest_"+System.currentTimeMillis()+".jpg";
  96. File file=new File(fileName);
  97. if(!file.getParentFile().exists()){
  98. file.getParentFile().mkdir();//创建文件夹
  99. }
  100. try {
  101. BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
  102. bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);//向缓冲区压缩图片
  103. bos.flush();
  104. bos.close();
  105. Toast.makeText(MainActivity.this, "拍照成功,照片保存在"+fileName+"文件之中!", Toast.LENGTH_LONG).show();
  106. } catch (Exception e) {
  107. // TODO Auto-generated catch block
  108. //e.printStackTrace();
  109. Toast.makeText(MainActivity.this, "拍照失败!"+e.toString(), Toast.LENGTH_LONG).show();
  110. }
  111. MainActivity.this.cam.stopPreview();
  112. MainActivity.this.cam.startPreview();
  113. }
  114. };
  115. private ShutterCallback sc=new ShutterCallback() {
  116.  
  117. @Override
  118. public void onShutter() {
  119. // 按下快门之后进行的操作
  120.  
  121. }
  122. };
  123. private PictureCallback pc=new PictureCallback() {
  124.  
  125. @Override
  126. public void onPictureTaken(byte[] data, Camera camera) {
  127. // TODO Auto-generated method stub
  128.  
  129. }
  130. };

Android Camera相机功能实现 拍照并保存图片的更多相关文章

  1. Android Camera 相机程序编写

    Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...

  2. 【转】Android Camera 相机开发详解

    在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...

  3. Android 调用摄像头功能【拍照与视频】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...

  4. android Camera相机类

    Camera相机类相关的几个流程方法 Camera.open(cameraId) 打开相机 camera.setDisplayOrientation(0) 设置相机水平方向 mCamera.setPr ...

  5. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  6. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  7. Android Camera 拍照 三星BUG总结

    Android Camera 三星BUG  : 近期在Android项目中使用拍照功能 , 其他型号的手机执行成功了  只有在三星的相机上遇到了bug . BUG详细体现为 : (1) 摄像头拍照后图 ...

  8. Android开发 Camera2开发_1_拍照功能开发

    介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是 ...

  9. Android 学习笔记之如何实现简单相机功能

    PS:看来算法和数据结构还是非常有用的,以后每天都练习两道算法题目...这次忘了对代码进行折叠了..导致篇幅过长... 学习内容: 1.Android如何实现相机功能... 2.如何实现音频的录制.. ...

随机推荐

  1. innodb事务日志详解

    首先看InnoDB的缓存和文件的关系图如下: InnoDB事务日志功能介绍 InnoDB使用日志来减少提交事务时的开销.因为日志中已经记录了事务,就无须在每个事务提交时把缓冲池的脏块刷新(flush) ...

  2. hdu 5706 GirlCat(BFS)

    As a cute girl, Kotori likes playing ``Hide and Seek'' with cats particularly. Under the influence o ...

  3. PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)

    畅通工程之最低成本建设问题(30 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路 ...

  4. Java-Runoob-高级教程:Java MySQL 连接

    ylbtech-Java-Runoob-高级教程:Java MySQL 连接 1.返回顶部 1. Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL ...

  5. JavaScript笔记——DOM的操作

    节点及其类型 在JavaScript中,节点分为三种: 元素节点:HTML标签元素. 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 文本节点: 是元素节点的子节点, 其内容为文本. 在什么 ...

  6. 实战MvcPager(PagerOptions自定义样式&同、异步)

    ASP.NET MVC下的分页控件MvcPager用起来简直太嗨呸了,两句代码实现一个分页,而且需要改变样式的时候直接构造PagerOptions类 实战无需多说,拿来用之即可.个人觉得对性能影响不大 ...

  7. 南京邮电大学网络攻防平台WEB题

    平台地址:http://ctf.nuptsast.com/ 签到题: 右键查看源代码,得到flag md5 collision: 传入的a的md5值要为0e开头的,但不能是QNKCDZO,百度一个0e ...

  8. python's twenty-second day for me 封装,property方法

    面对对象的三大特性:继承,多态,封装. 函数和属性装到了一个非全局的命名空间----封装. 封装: 在类中,静态属性,方法,对象属性都可以变成私有的,只需要在这些名字前加上‘__’(双下划线). 在类 ...

  9. Java的I/O流问题

    一.流的概念        流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等.        ...

  10. Python中的 set 与 深浅拷贝

    字符串 join() 格式:   "拼接的东西".join(可迭代对象) 可以加列表转换成字符串 lis = ['a','b','c','d'] s = "//" ...