[Android]照相机范例代码

原创 2012年04月19日 21:51:53

缘起

这是一个照相的范例,可预览,也可存档。

当初参加一个比赛,准备要做的应用的功能之一,可惜比赛没过关,不过还是将它弄成一个完整范例了。

下载

代码

package com.clouddemo.cameratest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.WindowManager;

public class CBCamera {
	static CBCamera m_instance;
	static final String TAG = "CameraDemo";
	
	Camera m_camera;
	WindowManager m_windowManager;
	ContentResolver m_contentResolver;
	
	public static CBCamera instance()
	{
		if(m_instance == null)
		{
			m_instance = new CBCamera();
		}
		return m_instance;
	}

	private CBCamera()
	{
		open();
	}
	
	public void setWindowManager(WindowManager windowManager)
	{
		m_windowManager = windowManager;
	}
	
	public void setContentResolver(ContentResolver contentResolver)
	{
		m_contentResolver = contentResolver;
	}
	
	public void initialPreview(SurfaceHolder holder)
	{
		try
		{
			if(m_camera != null)
			{
				m_camera.setPreviewDisplay(holder);
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	public void startPreview(int width, int height)
	{
		if(m_camera != null)
		{
			Camera.Parameters parameters = m_camera.getParameters();
			Display display = m_windowManager.getDefaultDisplay();

	        if(display.getRotation() == Surface.ROTATION_0)
	        {
	            parameters.setPreviewSize(height, width);                           
	            m_camera.setDisplayOrientation(90);
	        }

	        if(display.getRotation() == Surface.ROTATION_90)
	        {
	            parameters.setPreviewSize(width, height);                           
	        }

	        if(display.getRotation() == Surface.ROTATION_180)
	        {
	            parameters.setPreviewSize(height, width);               
	        }

	        if(display.getRotation() == Surface.ROTATION_270)
	        {
	            parameters.setPreviewSize(width, height);
	            m_camera.setDisplayOrientation(180);
	        }

        	//parameters.setPreviewSize(width, height);
        	m_camera.setParameters(parameters);
        	m_camera.startPreview();
		}
	}
	
	public void stopPreview()
	{
		if(m_camera != null)
		{
			m_camera.stopPreview();
		}
	}
	
	public void takePicture()
	{
		if(m_camera != null)
			m_camera.takePicture(shutterCallback, rawCallback, jpegCallback);
	}
	
	public void open()
	{
		if(m_camera == null)
			m_camera = Camera.open();
	}
	
	public void release()
	{
		if(m_camera != null)
		{
			m_camera.release();
			m_camera = null;
		}
	}
	
	ShutterCallback shutterCallback = new ShutterCallback() {
		public void onShutter() {
			Log.d(TAG, "onShutter'd");
		}
	};

	/** Handles data for raw picture */
	PictureCallback rawCallback = new PictureCallback() {
		public void onPictureTaken(byte[] data, Camera camera) {
			Log.d(TAG, "onPictureTaken - raw");
		}
	};

	/** Handles data for jpeg picture */
	PictureCallback jpegCallback = new PictureCallback() {
		public void onPictureTaken(byte[] data, Camera camera) {
			try
			{
				Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, data.length);
				String path = Environment.getExternalStorageDirectory().toString();
				String filename;
                Date date = new Date(0);
                SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss");
                filename =  sdf.format(date);
				OutputStream fOut = null;
                //File file = new File(path, "/DCIM/"+filename+".jpg");
				File file = new File(path, "/"+filename+".jpg");
                fOut = new FileOutputStream(file);
				//FileOutputStream out = new FileOutputStream(String.format("/sdcard/DCIM/Signatures/%d.jpg", System.currentTimeMillis()));
				bitmapPicture.compress(Bitmap.CompressFormat.JPEG, 0, fOut);
				fOut.flush();
				fOut.close();

				MediaStore.Images.Media.insertImage(m_contentResolver,file.getAbsolutePath(),file.getName(),file.getName());
			}
			catch(Exception ex)
			{
				ex.printStackTrace();
			}
			finally
			{
				camera.startPreview();
			}
			Log.d(TAG, "onPictureTaken - jpeg");
		}
	};
}



相关文章推荐

android4.0 camera 照相机代码jar包

  • 2013年04月02日 15:12
  • 8.39MB
  • 下载

Android 从照相机和相册选择图片使用原生代码裁剪(支持4.4 KIKAT及以上机型)

开发过程中总会遇到选择图片上传,或拍照上传的功能,写了一个支持Android4.4及以上版本也可以使用的统一代码,调用起来很简单,只需要一段代码就可以,下面就把代码贴出来,代码比较粗糙,希望大家指正。...

Android代码练习:打开系统照相机

目的:测试intent隐式意图启动其它应用程序的组件 技术点:Android系统中通过intent完成组件间的通信,intent寻找目标组件的方式有两种,一种是隐式意图,一种是显示意图,本次练习使用...

android打开媒体库、照相机相关代码总结及常用UI处理代码,值得收藏

原文在更多文章里

实现android布局的左右拖动及动画效果的代码范例

首先是PanelSwitcher类: package com.android.viewswitcher; import android.view.animation.TranslateAnimat...
  • jdsjlzx
  • jdsjlzx
  • 2012年05月06日 11:44
  • 3736

Android拍照、录像、录音代码范例

import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util...
  • gf771115
  • gf771115
  • 2011年07月27日 15:19
  • 16211

狂刷Android范例之4:用代码安装卸载app

狂刷Android范例之4:用代码安装卸载app说明狂刷Android范例系列文章开张了。每篇学习一个Android范例,将一个范例单独生成一个可运行的app,并对重点源代码进行简要分析。然后提供打包...

Android拍照、录像、录音代码范例

package com.cons.dcg.collect;import java.io.File;import java.text.SimpleDateFormat;import java.util....

Android创建组合控件(摘自《Android5.0开发范例代码大全》)

一、问题 需要通过组合现有的元素来创建自定义的小部件。 二、解决方案 通过扩展通用的ViewGroup并添加所需的功能就能创建自定义的小部件。创建自定义小部件或可重用用户界面元素的最简单、实用的方法就...

Android 5.0开发范例代码大全:第4版

  • 2015年11月17日 17:04
  • 14.05MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Android]照相机范例代码
举报原因:
原因补充:

(最多只允许输入30个字)