Android之Camera控制拍照
- package com.android.xiong.cameratest;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.DialogInterface;
- import android.graphics.Bitmap;
- import android.graphics.Bitmap.CompressFormat;
- import android.graphics.BitmapFactory;
- import android.graphics.ImageFormat;
- import android.hardware.Camera;
- import android.hardware.Camera.AutoFocusCallback;
- import android.hardware.Camera.PictureCallback;
- import android.hardware.Camera.ShutterCallback;
- import android.os.Bundle;
- import android.os.Environment;
- import android.util.DisplayMetrics;
- import android.view.Display;
- import android.view.Menu;
- import android.view.SurfaceHolder;
- import android.view.SurfaceHolder.Callback;
- import android.view.LayoutInflater;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.EditText;
- import android.widget.ImageView;
- public class MainActivity extends Activity {
- SurfaceView sView;
- SurfaceHolder surfaceHodler;
- int screenWidth, screenHeight;
- // 定义系统所用的照相机
- Camera camera;
- // 是否存在预览中
- boolean isPreview = false;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 设置全屏
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.activity_main);
- // 获取窗口管理器
- WindowManager wm = getWindowManager();
- Display display = wm.getDefaultDisplay();
- DisplayMetrics metrics = new DisplayMetrics();
- // 获取屏幕的宽和高
- display.getMetrics(metrics);
- screenWidth = metrics.widthPixels;
- screenHeight = metrics.heightPixels;
- sView = (SurfaceView) findViewById(R.id.sView);
- // 设置surface不需要自己的维护缓存区
- sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- // 获得SurfaceView的SurfaceHolder
- surfaceHodler = sView.getHolder();
- // 为srfaceHolder添加一个回调监听器
- surfaceHodler.addCallback(new Callback() {
- @Override
- public void surfaceDestroyed(SurfaceHolder arg0) {
- // 如果camera不为null,释放摄像头
- if (camera != null) {
- if (isPreview)
- camera.stopPreview();
- camera.release();
- camera = null;
- }
- }
- @Override
- public void surfaceCreated(SurfaceHolder arg0) {
- // 打开摄像头
- initCamera();
- }
- @Override
- public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
- int arg3) {
- }
- });
- }
- private void initCamera() {
- if (!isPreview) {
- // 此处默认打开后置摄像头
- // 通过传入参数可以打开前置摄像头
- camera = Camera.open();
- camera.setDisplayOrientation(90);
- }
- if (!isPreview && camera != null) {
- Camera.Parameters parameters = camera.getParameters();
- // 设置预览照片的大小
- parameters.setPreviewSize(screenWidth, screenHeight);
- // 设置预览照片时每秒显示多少帧的最小值和最大值
- parameters.setPreviewFpsRange(4, 10);
- // 设置照片的格式
- parameters.setPictureFormat(ImageFormat.JPEG);
- // 设置JPG照片的质量
- parameters.set("jpeg-quality", 85);
- // 设置照片的大小
- parameters.setPictureSize(screenWidth, screenHeight);
- // 通过SurfaceView显示取景画面
- try {
- camera.setPreviewDisplay(surfaceHodler);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 开始预览
- camera.startPreview();
- isPreview = true;
- }
- }
- public void capture(View source) {
- if (camera != null) {
- // 控制摄像头自动对焦后才拍摄
- camera.autoFocus(autoFocusCallback);
- }
- }
- AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
- @Override
- public void onAutoFocus(boolean arg0, Camera arg1) {
- if (arg0) {
- // takePicture()方法需要传入三个监听参数
- // 第一个监听器;当用户按下快门时激发该监听器
- // 第二个监听器;当相机获取原始照片时激发该监听器
- // 第三个监听器;当相机获取JPG照片时激发该监听器
- camera.takePicture(new ShutterCallback() {
- @Override
- public void onShutter() {
- // 按下快门瞬间会执行此处代码
- }
- }, new PictureCallback() {
- @Override
- public void onPictureTaken(byte[] arg0, Camera arg1) {
- // 此处代码可以决定是否需要保存原始照片信息
- }
- }, myJpegCallback);
- }
- }
- };
- PictureCallback myJpegCallback = new PictureCallback() {
- @Override
- public void onPictureTaken(byte[] data, Camera camera) {
- // 根据拍照所得的数据创建位图
- final Bitmap bm = BitmapFactory.decodeByteArray(data, 0,
- data.length);
- // 加载布局文件
- View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
- final EditText potoName = (EditText) saveDialog
- .findViewById(R.id.photoNmae);
- // 获取saveDialog对话框上的ImageView组件
- ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
- // 显示刚刚拍得的照片
- show.setImageBitmap(bm);
- // 使用AlertDialog组件
- new AlertDialog.Builder(MainActivity.this)
- .setView(saveDialog)
- .setNegativeButton("取消", null)
- .setPositiveButton("保存",
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface arg0,
- int arg1) {
- // 创建一个位于SD卡上的文件
- File file = new File(Environment
- .getExternalStorageDirectory()
- + "/"
- + potoName.getText().toString()
- + ".jpg");
- FileOutputStream fileOutStream=null;
- try {
- fileOutStream=new FileOutputStream(file);
- //把位图输出到指定的文件中
- bm.compress(CompressFormat.JPEG, 100, fileOutStream);
- fileOutStream.close();
- } catch (IOException io) {
- io.printStackTrace();
- }
- }
- }).show();
- //重新浏览
- camera.stopPreview();
- camera.startPreview();
- isPreview=true;
- }
- };
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
Android之Camera控制拍照的更多相关文章
- Android Camera进行拍照
Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤: 1.调用Camera的open()方法打开相机. 2.调用Camera的getParameters()方法获取拍照参数 ...
- Android开发之控制摄像头拍照
如今的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦.光学变焦这些仅仅有单反才有的功能,甚至有些手机直接宣传能够拍到星星.能够说手机已经变成了专业数码相机.为 ...
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能. ...
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...
- Android 开发 Camera类的拍照与录像
前言 在开发Android应用的时候,如果需要调用摄像头拍照或者录像,除了通过Intent调用系统现有相机应用进行拍照录像之外,还可以通过直接调用Camera硬件去去获取摄像头进行拍照录像的操作.本篇 ...
- Android Camera后台拍照
http://item.congci.com/item/android-camera-houtai-paizhao 有许多人希望在不让用户知道的情况下,使用Android后台Service调用摄像头拍 ...
- 使用Camera进行拍照
Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤如下: 1.调用Camera的open()方法打开相机. 2.调用Camera的getParameters()方法获取拍照 ...
- android——创建camera应用(译)
只是选择相机部分来翻译.下面是主要内容 有些开发者可能需要Camera的接口,来定制自己程序的外观和特殊功能.创建自定义的Camera界面比使用using an Intent需要编写更多的代码,但是 ...
- 通过Camera进行拍照
Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity; import j ...
随机推荐
- _WSAStartup@8,该符号在函数 _main 中被引用
int WSAStartup( __in WORD wVersionRequested, __out LPWSADATA lpWSAData ); WSAStartup 格 式: int PASCA ...
- vs c++配置opencv(1)
环境: vs2013 opencv2.4.13 准备工作: 1.安装opencv. opencv各版本间存在API差异,opencv提供相应版本的vc文件,在其安装目录 ..opencv\build\ ...
- fopen()函数
1.2 文件的输入输出函数 键盘.显示器.打印机.磁盘驱动器等逻辑设备, 其输入输出都能够通过文件管理的方法来完毕.而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 具体介绍Turb ...
- ADO.NET基础笔记
ADO.NET 程序要和数据库交互要通过ADO.NET进行,通过ADO.Net就能在程序中执行SQL了. ADO.Net中提供了对各种不同的数据库的统一操作接口. 连接字符串: 程序通过连接字符串指定 ...
- [Swust OJ 795]--Penney Game
题目链接:http://acm.swust.edu.cn/problem/795/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- PHP 8大安全函数
1. mysql_real_escape_string() 这个函数对于在PHP中防止SQL注入攻击很有帮助,它对特殊的字符,像单引号和双引号,加上了“反斜杠”,确保用户的输入在用它去查询以前已经是安 ...
- 转: ajax跨域之JSONP
事件背景: 某个站点分为静态产品介绍页面(或由于某原因需要静态化),和一个独立的在线应用程序.静态产品页面属于www.a.com下,而在线应用程序作为一个相对独立的系统存在于app.a.com上. 在 ...
- Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)
最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到 ...
- 解读Google分布式锁服务
解读Google分布式锁服务 背景介绍 在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文. 在此之前,Google的索引更 ...
- java学习之url
package com.gh.URL; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...