通过Camera进行拍照

来源:互联网 发布:淘宝通用好评200字 编辑:程序博客网 时间:2024/04/28 04:23

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;@Overrideprotected 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的SurfaceHoldersHolder = sView.getHolder();// 为sHolder添加一个回调监听器sHolder.addCallback(new Callback() {@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 打开并初始化摄像头initCamera();}@Overridepublic 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() {@Overridepublic void onClick(View v) {if (camera != null) {// 拍照camera.takePicture(null, null, myjpegCallback);}}});}PictureCallback myjpegCallback = new PictureCallback() {@Overridepublic 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() {@Overridepublic 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()方法既可。

原创粉丝点击