zoukankan      html  css  js  c++  java
  • 通过Camera进行拍照

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

  • 相关阅读:
    Codeforces Round #192 (Div. 2)
    STL删除vector或list的方法及注意的问题
    HDU 4614 (13年多校第二场1004)裸线段树
    将汇编的指令画在图片上==可以贴图法操作==动动图片图案指示就行了。(堆积木编译器)
    MySQL Connector/Python 安装、测试
    crtmpserver的架构简介
    hi3531的i2c部分 分类: HI3531 2014-03-18 14:41 948人阅读 评论(0) 收藏
    bootrom的构成 分类: vxWorks 2014-03-14 08:48 315人阅读 评论(0) 收藏
    bootrom脚本的创建 分类: vxWorks 2014-03-14 08:47 307人阅读 评论(0) 收藏
    ROM型启动方式概述 分类: vxWorks 2014-03-14 08:47 297人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3186846.html
Copyright © 2011-2022 走看看