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()方法既可。

更多相关文章

  1. 超简单实现Android(安卓)屏幕截屏(需要系统级权限)
  2. My Android(安卓)Camera Notes
  3. Android(安卓)的权限设置大全
  4. Android(安卓)蓝牙操作--读取远程已配对的蓝牙设备
  5. android 定时熄屏
  6. Android(安卓)程序的安装、卸载和更新
  7. Android(安卓)NotificationListenerService监听获取通知栏通知和
  8. 使用ContentProvider管理照片
  9. Android7.0调用系统相机和裁剪

随机推荐

  1. AsyncTask总结
  2. android studio 学习日记 报错
  3. android studio使用问题及说明
  4. android操作XML的几种方式
  5. Android(安卓)sensor hal 详解
  6. Android刷Root方法,zergRush,Odin3+CWM(Cl
  7. 【Android开发必备】Android APP开发经验
  8. android中的一些特性
  9. Adnroid开发中ListView使用SimpleAdapter
  10. Android LinearLayout 绾挎€у竷灞€