Android Camera进行拍照
来源:互联网 发布:求实软件操作流程 编辑:程序博客网 时间:2024/03/28 23:25
Android Camera进行拍照
Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤:
1、调用Camera的open()方法打开相机。
2、调用Camera的getParameters()方法获取拍照参数,该方法返回一个Camera.Parameters对象。
3、调用Camera.Parameters对象方法设置拍照参数。
4、调用Camera的setParameter(),将Camera.Parameters对象作为参数传入,既可对相机的拍照参数进行控制,注:Android 2.2.3以后不需要这步。
5、调用Camera的startPreview()方法开始预览取景,在预览取景之前需调用Camera的setPreviewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。
6、调用Camera的takePicture()方法进行拍照。
7、结束程序时,调用Camera的stopPreview()结束取景预览,并调用release()方法释放资源。
下面直接上代码:
1 public class CaptureImage extends Activity 2 { 3 SurfaceView sView; 4 SurfaceHolder surfaceHolder; 5 int screenWidth, screenHeight; 6 // 定义系统所用的照相机 7 Camera camera; 8 //是否在浏览中 9 boolean isPreview = false; 10 @Override 11 public void onCreate(Bundle savedInstanceState) 12 { 13 super.onCreate(savedInstanceState); 14 // 设置全屏 15 requestWindowFeature(Window.FEATURE_NO_TITLE); 16 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 17 WindowManager.LayoutParams.FLAG_FULLSCREEN); 18 setContentView(R.layout.main); 19 WindowManager wm = (WindowManager) getSystemService( 20 Context.WINDOW_SERVICE); 21 Display display = wm.getDefaultDisplay(); 22 // 获取屏幕的宽和高 23 screenWidth = display.getWidth(); 24 screenHeight = display.getHeight(); 25 // 获取界面中SurfaceView组件 26 sView = (SurfaceView) findViewById(R.id.sView); 27 // 获得SurfaceView的SurfaceHolder 28 surfaceHolder = sView.getHolder(); 29 // 为surfaceHolder添加一个回调监听器 30 surfaceHolder.addCallback(new Callback() 31 { 32 @Override 33 public void surfaceChanged(SurfaceHolder holder, int format, int width, 34 int height) 35 { 36 } 37 @Override 38 public void surfaceCreated(SurfaceHolder holder) 39 { 40 // 打开摄像头 41 initCamera(); 42 } 43 @Override 44 public void surfaceDestroyed(SurfaceHolder holder) 45 { 46 // 如果camera不为null ,释放摄像头 47 if (camera != null) 48 { 49 if (isPreview) 50 camera.stopPreview(); 51 camera.release(); 52 camera = null; 53 } 54 } 55 }); 56 // 设置该SurfaceView自己不维护缓冲 57 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 58 } 59 60 private void initCamera() 61 { 62 if (!isPreview) 63 { 64 camera = Camera.open(); 65 } 66 if (camera != null && !isPreview) 67 { 68 try 69 { 70 Camera.Parameters parameters = camera.getParameters(); 71 // 设置预览照片的大小 72 parameters.setPreviewSize(screenWidth, screenHeight); 73 // 每秒显示4帧 74 parameters.setPreviewFrameRate(4); 75 // 设置图片格式 76 parameters.setPictureFormat(PixelFormat.JPEG); 77 // 设置JPG照片的质量 78 parameters.set("jpeg-quality", 85); 79 //设置照片的大小 80 parameters.setPictureSize(screenWidth, screenHeight); 81 camera.setParameters(parameters); 82 //通过SurfaceView显示取景画面 83 camera.setPreviewDisplay(surfaceHolder); 84 // 开始预览 85 camera.startPreview(); 86 // 自动对焦 87 camera.autoFocus(null); 88 } 89 catch (Exception e) 90 { 91 e.printStackTrace(); 92 } 93 isPreview = true; 94 } 95 } 96 97 @Override 98 public boolean onKeyDown(int keyCode, KeyEvent event) 99 {100 switch (keyCode)101 {102 // 当用户单击照相键、中央键时执行拍照103 case KeyEvent.KEYCODE_DPAD_CENTER:104 case KeyEvent.KEYCODE_CAMERA:105 if (camera != null && event.getRepeatCount() == 0)106 {107 // 拍照108 camera.takePicture(null, null , myjpegCallback);109 return true;110 }111 break;112 } 113 return super.onKeyDown(keyCode, event);114 }115 116 PictureCallback myjpegCallback = new PictureCallback()117 {118 @Override119 public void onPictureTaken(byte[] data, Camera camera)120 {121 // 根据拍照所得的数据创建位图122 final Bitmap bm = BitmapFactory.decodeByteArray(data123 , 0, data.length);124 // 加载/layout/save.xml文件对应的布局资源125 View saveDialog = getLayoutInflater().inflate(126 R.layout.save, null);127 final EditText photoName = (EditText) saveDialog128 .findViewById(R.id.phone_name);129 // 获取saveDialog对话框上的ImageView组件130 ImageView show = (ImageView) saveDialog.findViewById(R.id.show);131 // 显示刚刚拍得的照片132 show.setImageBitmap(bm);133 //使用对话框显示saveDialog组件134 new AlertDialog.Builder(CaptureImage.this)135 .setView(saveDialog)136 .setPositiveButton("保存", new OnClickListener()137 {138 @Override139 public void onClick(DialogInterface dialog,140 int which)141 {142 // 创建一个位于SD卡上的文件143 File file = new File(Environment.getExternalStorageDirectory()144 , photoName.getText().toString() + ".jpg");145 FileOutputStream outStream = null;146 try147 {148 // 打开指定文件对应的输出流149 outStream = new FileOutputStream(file);150 // 把位图输出到指定文件中151 bm.compress(CompressFormat.JPEG, 100, outStream);152 outStream.close();153 }154 catch (IOException e)155 {156 e.printStackTrace();157 }158 }159 })160 .setNegativeButton("取消", null)161 .show();162 //重新浏览163 camera.stopPreview();164 camera.startPreview();165 isPreview = true;166 }167 };168 }
0 0
- Android Camera进行拍照
- Android Camera进行拍照
- Android:通过Camera进行拍照
- android 拍照 Camera类 使用照相机进行拍照 翻译
- 通过Camera进行拍照
- 初学Android,多媒体之使用Camera进行拍照(七十九)
- android下自定义Camera进行录像和拍照
- android camera 后台拍照
- Android之Camera拍照
- android Camera拍照
- Android+Camera+拍照
- Android Camera拍照实现
- Android Camera 无法拍照
- Android Camera拍照
- Android之Camera拍照
- Android照相机拍照Camera
- Android camera拍照分辨率
- android相机camera拍照
- systemui状态栏半透明修改
- XTU1175:Hurry Up(三分)
- K sum
- Ruby on Rails delete 和 destroy 的区别
- (未时学术)谷歌学术(Google Scholar)使用方法小全书
- Android Camera进行拍照
- 国外虚拟运营商的制胜之道
- 用location对象的hash属性构建AJAX筛选功能
- read
- Android 的独特shell命令
- 中国互联网巨头百度阿里腾讯(BAT)内部员工的真实情况大揭秘
- 很值得学习的Linux C++线程池框架
- 《Java从入门到精通(第3版)》
- Hao语言--描述文法的XML和加载的类