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控制拍照的更多相关文章

  1. Android Camera进行拍照

    Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤: 1.调用Camera的open()方法打开相机. 2.调用Camera的getParameters()方法获取拍照参数 ...

  2. Android开发之控制摄像头拍照

    如今的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦.光学变焦这些仅仅有单反才有的功能,甚至有些手机直接宣传能够拍到星星.能够说手机已经变成了专业数码相机.为 ...

  3. 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

    杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能. ...

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

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

  5. Android 开发 Camera类的拍照与录像

    前言 在开发Android应用的时候,如果需要调用摄像头拍照或者录像,除了通过Intent调用系统现有相机应用进行拍照录像之外,还可以通过直接调用Camera硬件去去获取摄像头进行拍照录像的操作.本篇 ...

  6. Android Camera后台拍照

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

  7. 使用Camera进行拍照

    Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤如下: 1.调用Camera的open()方法打开相机. 2.调用Camera的getParameters()方法获取拍照 ...

  8. android——创建camera应用(译)

     只是选择相机部分来翻译.下面是主要内容 有些开发者可能需要Camera的接口,来定制自己程序的外观和特殊功能.创建自定义的Camera界面比使用using an Intent需要编写更多的代码,但是 ...

  9. 通过Camera进行拍照

    Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可: 下面用一个示例来演示: Activity: package com.home.activity; import j ...

随机推荐

  1. RADOS工作原理

    转:http://www.csdn.net/article/2014-04-08/2819192-ceph-swift-on-openstack-m/2 Ceph的工作原理及流程 本节将对Ceph的工 ...

  2. map的erase()释放内存

    STL中的map调用erase(it),当value值为指针时,释放内存: #include <iostream> #include <map> #include <st ...

  3. 面试之hack(转载)

    史上最全的CSS hack方式一览 css hack api   做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方 ...

  4. HTML5 Web Storage使用实例

    很久没写文章了,忙加懒实在没办法,之前也看过关于Web Storage的文章,当时就觉得各各浏览器的支持跟上来还早着呢,像我们这样做门户网站的一时半会儿也用不上,毕竟用户群体鱼目混杂嘛,最近各各浏览器 ...

  5. 带参数的存储过程和标量Function

    在SQL Server中,我们通常会使用NEWID(),GETDATE(),等一些数据库函数,这些函数是很有帮助的,然后数据库也能够让我们自己写函数,即Function,下面简单说说Function的 ...

  6. poj 3286 统计0的个数

    #include <iostream> using namespace std; long long p; ]; long long solve(long long n){ ; ;i< ...

  7. Vijos P1740聪明的质检员

    题目 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是:1.给定m个区间[Li,Ri]:2. ...

  8. BZOJ 1610: [Usaco2008 Feb]Line连线游戏

    1610: [Usaco2008 Feb]Line连线游戏 Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 &l ...

  9. ASP.NET 内置对象涉略

    一.ASP.NET中内置的常用对象的介绍 本文列举了ASP.NET 的八个内置对象,其中前五个是比较常用的. 1.Response Response 对象用于从服务器向用户发送输出的结果. Write ...

  10. 解析LayoutSubviews

    layoutSubviews作用 layoutSubviews是对subviews重新布局.比如,我们想更新子视图的位置的时候,可以通过调用layoutSubviews方法,既可以实现对子视图重新布局 ...