Android通过Camera来控制拍照,使用Camera比较简单,按步骤进行即可:

下面用一个示例来演示:

Activity:

package com.home.activity;

import java.io.File;
import java.io.FileOutputStream; import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView; import com.home.camera.R; public class TestCameraActivity extends Activity {
private SurfaceView sView;
private SurfaceHolder sHolder;
// 屏幕宽和高
private int screenWidth, screenHeight;
// 定义系统所用的照相机
private Camera camera;
// 摄像头是否已经在预览状态. true:预览状态 ;false:没有预览状态
private boolean isPreview;
private Button playBtn; @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.main);
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
// 获取屏幕的宽和高
screenWidth = wm.getDefaultDisplay().getWidth();
screenHeight = wm.getDefaultDisplay().getHeight();
playBtn = (Button) findViewById(R.id.main_btn);
// 获取界面中的SurfaceView组件
sView = (SurfaceView) findViewById(R.id.main_sView);
// 获取SurfaceView的SurfaceHolder
sHolder = sView.getHolder();
// 为sHolder添加一个回调监听器
sHolder.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自己不维护缓冲区
sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} /**
* 初始化摄像头
*/
private void initCamera() {
if (!isPreview) {
camera = Camera.open();
}
if (camera != null && !isPreview) {
try {
Parameters parameters = camera.getParameters();
// 设置闪光灯为自动状态
parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
camera.setParameters(parameters);
// 设置预览照片的大小
parameters.setPreviewSize(screenWidth, screenHeight);
// 设置每秒显示4帧
parameters.setPreviewFrameRate(4);
// 设置图片格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 设置JPG照片的质量
parameters.set("jpeg-quality", 85);
// 设置照片大小
parameters.setPictureSize(screenWidth, screenHeight);
// 通过SurfaceView显示取景画面
camera.setPreviewDisplay(sHolder);
// 如果是竖屏
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
camera.setDisplayOrientation(90);
} else {
camera.setDisplayOrientation(0);
}
// 开始预览
camera.startPreview();
// 自动对焦
camera.autoFocus(null);
isPreview = true;
} catch (Exception e) {
e.printStackTrace();
} }
playBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
if (camera != null) {
// 拍照
camera.takePicture(null, null, myjpegCallback);
}
}
});
} PictureCallback myjpegCallback = new PictureCallback() { @Override
public void onPictureTaken(final byte[] data, Camera camera) {
// 根据拍照所得的数据创建位图
final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
// 加载save.xml文件对应的布局资源
View saveDialog = getLayoutInflater().inflate(R.layout.save, null);
final EditText photoName = (EditText) saveDialog
.findViewById(R.id.save_et_name);
ImageView showView = (ImageView) saveDialog
.findViewById(R.id.save_image);
// 显示刚刚拍得的照片
showView.setImageBitmap(bitmap);
// 使用对话框显示saveDialog组件
new AlertDialog.Builder(TestCameraActivity.this)
.setView(saveDialog)
.setPositiveButton("保存",
new DialogInterface.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);
// 把位图输出到指定文件中
bitmap.compress(CompressFormat.JPEG,
100, outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}).setNegativeButton("取消", null).show();
// 重新预览
camera.stopPreview();
camera.startPreview();
isPreview = true;
}
};
}

Activity的布局XML就一个拍照按钮和SurfaceView组件,就此省略
对话框的布局XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="输入照片名称" /> <EditText
android:id="@+id/save_et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:singleLine="true" />
</LinearLayout> <ImageView
android:id="@+id/save_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </LinearLayout>

加上如下权限:

    <!-- 写入外部存储卡的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 加入拍照权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 加入摄像头的附加功能 -->
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 加入闪光灯权限 -->
<uses-permission android:name="android.permission.FLASHLIGHT" />

另外,拍照按钮也可以使用手机上的快捷键,回调OnKeyDown()方法既可。

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

  1. Android Camera进行拍照

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

  2. 使用Camera进行拍照

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

  3. Android之Camera控制拍照

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

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

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

  5. 使用Camera进行拍照 & 后台静默拍照的思路

    Android中的Camera可以用来进行自定义相机.取景框实时预览.拍照等操作.在5.0中,这个类不推荐使用了,新出了一个Camera2,那个东西没怎么研究过,反正一时半会用不到.本篇讲解的是如果用 ...

  6. 玩转Android Camera开发(二):使用TextureView和SurfaceTexture预览Camera 基础拍照demo

    Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...

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

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

  8. Android Camera开发:使用TextureView和SurfaceTexture预览Camera 基础拍照demo

    Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...

  9. Android Camera开发:使用GLSurfaceView预览Camera 基础拍照

    GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处.独到之处在哪?当使用Surfaceview无能为力.痛不欲生时就只有使用GLSur ...

随机推荐

  1. NodeJS会是昙花一现吗?

    在用了一年以后,我感觉node.js有一点不正确劲.它非常有意思,可是我认为我应该用另外一个视角去审视它. 网络编程真的能够更easy吗? node.js无疑有一些设计很好的地方.前段时间我写了一个性 ...

  2. asp.net2.0安全性(1)--用户角色篇(起篇)--转载来自车老师

    安全管理的解决方案在.net1.1中几乎为一片空白,对于应用程序的验证与授权大部分的工作是开发人员自己编写代码,或者是借助企业库等工具来实现,此可谓.net1.1中的一大缺憾.在.net2.0中微软为 ...

  3. MSSQL - 因为数据库正在使用,所以无法获得对数据库的独占访问权。

    关于“因为数据库正在使用,所以无法获得对数据库的独占访问权”的最终解决方案   今天在使用SQL Server2005对某个数据库进行还原操作的时候,出现了如上问题,“因为数据库正在使用,所以无法获得 ...

  4. Java面试题精选(三) JSP/Servlet Java面试逻辑题

    --   JSP/Servlet  Java面试逻辑题   --     很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HT ...

  5. Windows下实战Apache+PHP [转]

        一.Apache 1.下载登陆Apache Lougne(http://www.apachelounge.com/download/),找到最新版本的Apache.笔者下载的是带IPv6和Cr ...

  6. UVALive 2519 Radar Installation 雷达扫描 区间选点问题

    题意:在坐标轴中给出n个岛屿的坐标,以及雷达的扫描距离,要求在y=0线上放尽量少的雷达能够覆盖全部岛屿. 很明显的区间选点问题. 代码: /* * Author: illuz <iilluzen ...

  7. android 实现跳动频谱 DEMO

    package com.terry.AudioFx; import android.app.Activity; import android.content.Context; import andro ...

  8. JSP的学习(7)——九大隐式对象之pageContext对象

    本篇来讲诉JSP中九大隐式对象中最后一个,也是最重要的一个对象——pageContext对象. pageContext对象代表了该JSP页面的运行环境,它的作用有: ① 这个对象封装了对其它八大隐式对 ...

  9. 学习javascript语言精粹的笔记

    1.枚举: 用for in 语句来遍历一个对象中所有的属性名,该枚举过程将会列出所有的属性也包括涵数和方法,如果我们想过滤掉那些不想要的值,最为常用的过滤器为hasOwnProperty方法,以及使用 ...

  10. POJ 3017 单调队列dp

    Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 ...