博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
camera.takePicture拍照案例
阅读量:4150 次
发布时间:2019-05-25

本文共 3889 字,大约阅读时间需要 12 分钟。

给大家来一个使用camera.takePicture拍照的案例,这个是使用android.hardware.Camera硬件方式的。

主要源码:

  1. package com.android.cameraAndroid;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import java.io.File;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.graphics.PixelFormat;
  10. import android.hardware.Camera;
  11. import android.hardware.Camera.Parameters;
  12. import android.hardware.Camera.PictureCallback;
  13. import android.hardware.Camera.ShutterCallback;
  14. import android.media.AudioManager;
  15. import android.media.ToneGenerator;
  16. import android.net.Uri;
  17. import android.os.Environment;
  18. import android.os.StatFs;
  19. import android.view.Menu;
  20. import android.view.MenuItem;
  21. import android.view.SurfaceHolder;
  22. import android.view.SurfaceView;
  23. public class CameraAndroid extends Activity {
  24.         private CameraPreview preview;
  25.         private Camera camera;
  26.         private ToneGenerator tone;
  27.         private static final int OPTION_SNAPSHOT = 0;
  28.         @Override
  29.         public void onCreate(Bundle savedInstanceState) {
  30.                 super.onCreate(savedInstanceState);
  31.                 preview = new CameraPreview(this);
  32.                 setContentView(preview);
  33.         }
  34.         @Override
  35.         public boolean onOptionsItemSelected(MenuItem item) {
  36.                 int itemId = item.getItemId();
  37.                 switch(itemId){
  38.                 case OPTION_SNAPSHOT:
  39.                         //拍摄照片
  40.                         camera.takePicture(shutterCallback, null, jpegCallback);
  41.                         break;
  42.                 }
  43.                 return true;
  44.         }
  45.         //返回照片的JPEG格式的数据
  46.         private PictureCallback jpegCallback = new PictureCallback(){
  47.                 public void onPictureTaken(byte[] data, Camera camera) {
  48.                         Parameters ps = camera.getParameters();
  49.                         if(ps.getPictureFormat() == PixelFormat.JPEG){
  50.                             //存储拍照获得的图片
  51.                             String path = save(data);
  52.                             //将图片交给Image程序处理
  53.                             Uri uri = Uri.fromFile(new File(path));
  54.                                Intent intent = new Intent();
  55.                                intent.setAction("android.intent.action.VIEW");
  56.                                intent.setDataAndType(uri, "image/jpeg");
  57.                                startActivity(intent);
  58.                         }
  59.                 }
  60.         };
  61.         
  62.         //快门按下的时候onShutter()被回调
  63.         private ShutterCallback shutterCallback = new ShutterCallback(){
  64.                 public void onShutter() {
  65.                         if(tone == null)
  66.                                 //发出提示用户的声音
  67.                                 tone = new ToneGenerator(AudioManager.STREAM_MUSIC,
  68.                                                 ToneGenerator.MAX_VOLUME);
  69.                         tone.startTone(ToneGenerator.TONE_PROP_BEEP2);
  70.                 }
  71.         };
  72.         
  73.         private String save(byte[] data){
  74.                 String path = "/sdcard/"+System.currentTimeMillis()+".jpg";
  75.                 try {
  76.                         //判断是否装有SD卡
  77.                         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  78.                                 //判断SD卡上是否有足够的空间
  79.                                 String storage = Environment.getExternalStorageDirectory().toString();
  80.                                 StatFs fs = new StatFs(storage);
  81.                                 long available = fs.getAvailableBlocks()*fs.getBlockSize();
  82.                                 if(available<data.length){
  83.                                         //空间不足直接返回空
  84.                                         return null;
  85.                                 }
  86.                                 File file = new File(path);
  87.                                 if(!file.exists())
  88.                                         //创建文件
  89.                                         file.createNewFile();
  90.                                 FileOutputStream fos = new FileOutputStream(file);
  91.                                 fos.write(data);
  92.                                 fos.close();
  93.                         }
  94.                 } catch (Exception e) {
  95.                         e.printStackTrace();
  96.                         return null;
  97.                 }
  98.                 return path;
  99.         }
  100.         @Override
  101.         public boolean onCreateOptionsMenu(Menu menu) {
  102.                 menu.add(0, OPTION_SNAPSHOT, 0, R.string.snapshot);
  103.                 return super.onCreateOptionsMenu(menu);
  104.         }
  105.         class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
  106.                 SurfaceHolder mHolder;
  107.                 public CameraPreview(Context context) {
  108.                         super(context);
  109.                         mHolder = getHolder();
  110.                         mHolder.addCallback(this);
  111.                         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  112.                 }
  113.                 //Sureface创建的时候,此方法被调用
  114.                 public void surfaceCreated(SurfaceHolder holder) {
  115.                         //打开摄像头,获得Camera对象
  116.                         camera = Camera.open();
  117.                         try {
  118.                                 //设置显示
  119.                                 camera.setPreviewDisplay(holder);
  120.                         } catch (IOException exception) {
  121.                                 camera.release();
  122.                                 camera = null;
  123.                         }
  124.                 }
  125.                 //Surface销毁的时候,此方法被调用
  126.                 public void surfaceDestroyed(SurfaceHolder holder) {
  127.                         camera.stopPreview();
  128.                         //释放Camera
  129.                         camera.release();
  130.                         camera = null;
  131.                 }
  132.                 public void surfaceChanged(SurfaceHolder holder, int format, int w,
  133.                                 int h) {
  134.                         //已经获得Surface的width和height,设置Camera的参数
  135.                         Camera.Parameters parameters = camera.getParameters();
  136.                         parameters.setPreviewSize(w, h);
  137.                         camera.setParameters(parameters);
  138.                         //开始预览
  139.                         camera.startPreview();
  140.                 }
  141.         }
  142. }
复制代码

注意:记得加权限:<uses-permission android:name="android.permission.CAMERA" />

转载地址:http://tavti.baihongyu.com/

你可能感兴趣的文章
看完全都会了!Android开发热门前沿知识,积累总结
查看>>
看完吊打面试官!海量算法高频面试题精编解析,附带学习经验
查看>>
看完豁然开朗!一线互联网大厂面试真题系统收录!社招面试心得
查看>>
真是经典中的经典!Android开发你需要了解的那些事,深度好文
查看>>
程序员的中年危机,我想谈谈关于Android面试那些事,深度好文
查看>>
程序员真的是吃青春饭吗?面试官6个灵魂拷问,分享一点面试小经验
查看>>
程序员进阶!Android黑科技保活实现原理揭秘,分享一点面试小经验
查看>>
算法太TM重要了!2021年Android春招面试经历,这原因我服了
查看>>
经典好文!想找工作的你还不看这份资料就晚了!快来收藏!
查看>>
经验分享:掌握这套精编Android高级面试题解析,跳槽薪资翻倍
查看>>
美团安卓面试,程序员如何自我学习和成长?先收藏了
查看>>
老师讲的真棒!你的技术真的到天花板了吗?不吃透都对不起自己
查看>>
腾讯T2亲自讲解!你有过迷茫吗?系列篇
查看>>
腾讯T2大牛亲自讲解!6年老Android面经总结,面试真题解析
查看>>
BTAJ面试有关散列(哈希)表的面试题详解,成功入职腾讯
查看>>
Context都没弄明白凭什么拿高薪?附小技巧
查看>>
databinding双向绑定,带你玩转自定义view系列,先收藏了
查看>>
flutter开发工具,一篇文章教你搞定计算机网络面试,吐血整理
查看>>
flutter开发桌面应用,如何才能通过一线互联网公司面试?已开源
查看>>
flutter技术入门与实战!妈妈再也不用担心我的面试,隔壁都馋哭了
查看>>