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()方法释放资源。

下面直接上代码:

 public class CaptureImage extends Activity
{
SurfaceView sView;
SurfaceHolder surfaceHolder;
int screenWidth, screenHeight;
// 定义系统所用的照相机
Camera camera;
//是否在浏览中
boolean isPreview = false;
@Override
public 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.main);
WindowManager wm = (WindowManager) getSystemService(
Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
// 获取屏幕的宽和高
screenWidth = display.getWidth();
screenHeight = display.getHeight();
// 获取界面中SurfaceView组件
sView = (SurfaceView) findViewById(R.id.sView);
// 获得SurfaceView的SurfaceHolder
surfaceHolder = sView.getHolder();
// 为surfaceHolder添加一个回调监听器
surfaceHolder.addCallback(new Callback()
{
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// 打开摄像头
initCamera();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// 如果camera不为null ,释放摄像头
if (camera != null)
{
if (isPreview)
camera.stopPreview();
camera.release();
camera = null;
}
}
});
// 设置该SurfaceView自己不维护缓冲
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} private void initCamera()
{
if (!isPreview)
{
camera = Camera.open();
}
if (camera != null && !isPreview)
{
try
{
Camera.Parameters parameters = camera.getParameters();
// 设置预览照片的大小
parameters.setPreviewSize(screenWidth, screenHeight);
// 每秒显示4帧
parameters.setPreviewFrameRate(4);
// 设置图片格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 设置JPG照片的质量
parameters.set("jpeg-quality", 85);
//设置照片的大小
parameters.setPictureSize(screenWidth, screenHeight);
camera.setParameters(parameters);
//通过SurfaceView显示取景画面
camera.setPreviewDisplay(surfaceHolder);
// 开始预览
camera.startPreview();
// 自动对焦
camera.autoFocus(null);
}
catch (Exception e)
{
e.printStackTrace();
}
isPreview = true;
}
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
// 当用户单击照相键、中央键时执行拍照
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_CAMERA:
if (camera != null && event.getRepeatCount() == 0)
{
// 拍照
camera.takePicture(null, null , myjpegCallback);
return true;
}
break;
}
return super.onKeyDown(keyCode, event);
} PictureCallback myjpegCallback = new PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
// 根据拍照所得的数据创建位图
final Bitmap bm = BitmapFactory.decodeByteArray(data
, 0, data.length);
// 加载/layout/save.xml文件对应的布局资源
View saveDialog = getLayoutInflater().inflate(
R.layout.save, null);
final EditText photoName = (EditText) saveDialog
.findViewById(R.id.phone_name);
// 获取saveDialog对话框上的ImageView组件
ImageView show = (ImageView) saveDialog.findViewById(R.id.show);
// 显示刚刚拍得的照片
show.setImageBitmap(bm);
//使用对话框显示saveDialog组件
new AlertDialog.Builder(CaptureImage.this)
.setView(saveDialog)
.setPositiveButton("保存", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog,
int which)
{
// 创建一个位于SD卡上的文件
File file = new File(Environment.getExternalStorageDirectory()
, photoName.getText().toString() + ".jpg");
FileOutputStream outStream = null;
try
{
// 打开指定文件对应的输出流
outStream = new FileOutputStream(file);
// 把位图输出到指定文件中
bm.compress(CompressFormat.JPEG, 100, outStream);
outStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
})
.setNegativeButton("取消", null)
.show();
//重新浏览
camera.stopPreview();
camera.startPreview();
isPreview = true;
}
};
}

Android Camera进行拍照的更多相关文章

  1. Android Camera后台拍照

    http://item.congci.com/item/android-camera-houtai-paizhao 有许多人希望在不让用户知道的情况下,使用Android后台Service调用摄像头拍 ...

  2. Android之Camera控制拍照

    package com.android.xiong.cameratest; import java.io.File; import java.io.FileOutputStream; import j ...

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

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

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

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

  5. Android Camera 拍照 三星BUG总结

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

  6. Android Camera拍照 压缩

    http://www.linuxidc.com/Linux/2014-12/110924.htm package com.klp.demo_025; import java.io.ByteArrayI ...

  7. Android — Camera聚焦流程

    原文  http://www.cnphp6.com/archives/65098 主题 Android Camera.java autoFocus()聚焦回调函数 @Override public v ...

  8. Android调用相册拍照控件实现系统控件缩放切割图片

    android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.By ...

  9. android: 调用摄像头拍照

    很多应用程序都可能会使用到调用摄像头拍照的功能,比如说程序里需要上传一张图片 作为用户的头像,这时打开摄像头拍张照是最简单快捷的.下面就让我们通过一个例子来学 习一下,如何才能在应用程序里调用手机的摄 ...

随机推荐

  1. ubuntu 在mac 的 Parallels 的分辨率问题

    安装 ubuntu系统,刚开始安装成功的时候分辨率只有800*600. 设置里面只有800*600一个选项. http://linuxbsdos.com/2014/10/31/solutions-fo ...

  2. PHP获取毫秒时间戳,利用microtime()函数

    PHP获取毫秒时间戳,利用microtime()函数 php本身没有提供返回毫秒数的函数,但提供了一个microtime()函数,借助此函数,可以很容易定义一个返回毫秒数的函数.php的毫秒是没有默认 ...

  3. opensuse-13.1体验

    1  livecd安装 下载地址 http://software.opensuse.org/131/zh_CN 我下载的kde版本的livecd,不像ubuntu支持ultraiso的U盘安装,也不支 ...

  4. CentOS 7 防火墙和端口配置

    centos 7 防火墙和端口配置--解决 RHEL 7/ CentOS 7/Fedora 出现Unit iptables.service failed to load # 第一步,关闭firewal ...

  5. [已解决] 点击 【Show in system explorer】Eclipse卡死,未响应

    新版的Eclipse自带了 [Show in system explorer] 功能很方便,有一天突然不好用了,点它Eclipse就卡死, 可能由以下原因导致的: (可能性最大)windows本身有问 ...

  6. android sdcard信息获取

    手机存储都有两种,一种是 手机自带的存储,称为internal storage,另外一种用户额外插入的存储,称为removable storage (也就是外置sdcard的部分). removabl ...

  7. [问题2014S05] 复旦高等代数II(13级)每周一题(第五教学周)

    [问题2014S05]  设 \(A,B\) 分别是 \(4\times 3\) 和 \(3\times 4\) 实矩阵, \[ BA=\begin{pmatrix}-9 & -20 & ...

  8. System & Runtime &Math

    package com.shushine.framework.第七章Java标准类库;/** * * <p> * 描述该类情况 {@link 代表跟谁有关系} * </p> * ...

  9. abort终止正在进行中的的ajax请求

    核心:调用XMLHttpRequest对象上的abort方法 jQuery的ajax方法有自己的超时时间设置参数:   $.ajax({type:'POST', url:'b.php', data:' ...

  10. [Golang] 一个简易代理池

    晚上写了一个代理池,就是在一个代理网站上爬取代理ip和端口以及测试是否可用.接下来可能考虑扩展成一个比较大的 golang实现的代理池. 简易版代码: package main import ( &q ...