`

拍照Test

 
阅读更多
package com;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.graphics.Bitmap.CompressFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import com.cgt.camera.R;
import com.lilin.util.GetSysDate;
import com.lilin.util.SDCardHelp;
import com.lilin.util.ShowMsg;

/**
 * 
 * @author lilin
 * @date 2011-9-3 下午12:22:10
 * @ClassName: Main
 * @Description: TODO
 */
public class TakePhotoView extends Activity implements SurfaceHolder.Callback,
		OnClickListener, PictureCallback {
	private SurfaceView surfaceView;
	private SurfaceHolder surfaceHolder;
	private Camera camera;// 相机
	private Camera.Parameters cameraParam;// 相机参数
	private Camera.Size cameraSize;// 相机大小

	private boolean isPreViewing = true;
	private boolean isHasSurface;
	byte[] data;
	Button take_btn;// 拍照
	ImageView preView_iv;// 预览

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getWindow().setFormat(PixelFormat.TRANSLUCENT);
		requestWindowFeature(Window.FEATURE_NO_TITLE);// 无标题
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏
		setContentView(R.layout.takephotoview);
		initView();

	}

	// 界面创建时被调用,一般是用来,打开相机,设置预览
	public void surfaceCreated(SurfaceHolder holder) {
		if (camera == null) {
			camera = Camera.open();// 不能放在构造函数里,否则产生不了预览效果
			try {
				camera.setPreviewDisplay(holder);
			} catch (IOException e) {
				e.printStackTrace();
			}
			isHasSurface = true;
		}
	}

	// 在界面尺寸改变时被调用,设置相机的参数(大小,格式)
	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		if (isPreViewing) {
			isPreViewing = false;
			camera.stopPreview();
		}
		cameraParam = camera.getParameters();
		// 这项设置可以解决部分机型报setPreview()的错
		cameraParam.setPreviewSize(w, h);
		cameraParam.setPictureFormat(PixelFormat.JPEG);// 图片格式
		camera.setParameters(cameraParam);// 设置参数
		if (!isPreViewing) {
			camera.startPreview();
			isPreViewing = true;
		}
	}

	// 捕捉相机拍到的图片
	public void onPictureTaken(byte[] _data, Camera camera) {
		// 得到图片data
		Bitmap bitmap = BitmapFactory.decodeByteArray(_data, 0, _data.length);
		savepicture(bitmap, GetSysDate.getFormateDate(1));// 保存图片
		if (!isPreViewing) {
			camera.startPreview();
			isPreViewing = true;
		} else {
			isPreViewing = false;
			camera.stopPreview();
			camera.startPreview();// 开始预览
			isPreViewing = true;
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		if (camera != null) {
			if (isPreViewing) {
				camera.stopPreview();
				isPreViewing = false;
			}
			camera.release();
			camera = null;
		}
		isHasSurface = false;
	}

	// 保存图片
	public void savepicture(Bitmap bitmap, String formateDate) {
		try {
			if (!SDCardHelp.getFileSavePath(getString(R.string.pic_savepath))
					.toString().equals(null)) {
				File file = new File(SDCardHelp
						.getFileSavePath(getString(R.string.pic_savepath)),
						formateDate + ".jpg");// 创建图片文件
				FileOutputStream outStream = new FileOutputStream(file);
				bitmap.compress(CompressFormat.JPEG, 100, outStream);
				outStream.close();
				take_btn.setEnabled(true); // 设置拍照按钮可用
				take_btn.setBackgroundResource(R.drawable.take_picture1);
			} else {
				ShowMsg.showToast(getApplicationContext(), "请插入内存卡!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	// 获取最佳预览视图
	public Camera.Size getBestPreviewSize(Camera.Parameters parameters, int w,
			int h) {
		Camera.Size result = null;
		for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
			if (size.width <= w && size.height <= h) {
				if (null == result)
					result = size;
				else {
					int resultDelta = w - result.width + h - result.height;
					int newDelta = w - size.width + h - size.height;
					if (newDelta < resultDelta)
						result = size;
				}
			}
		}
		return result;
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.takepic_btn:// 拍照
			// 自动对焦
			camera.takePicture(null, null, this);
			take_btn.setEnabled(false);
			take_btn.setBackgroundResource(R.drawable.take_picture2);
			break;
		default:
			break;
		}
	}

	public void initView() {
		surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
		take_btn = (Button) findViewById(R.id.takepic_btn);
		preView_iv = (ImageView) findViewById(R.id.myImageView);
		take_btn.setOnClickListener(this);
	}

	protected void onPause() {
		System.out.println("onpause");
		super.onPause();
	}

	protected void onResume() {
		surfaceHolder = surfaceView.getHolder();
		surfaceHolder.addCallback(this);
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		super.onResume();
	}

}
分享到:
评论

相关推荐

    andriod camera test case

    通过"Android Camera Test Case",我们可以全面评估和优化Android手机的相机功能,为用户提供更优质的拍照和录像体验。而"camera_test"可能是一个包含这些测试用例的文件或脚本,用于自动化执行和记录测试结果。在...

    android test

    在Android平台上进行测试是开发过程中不可或缺的一环,尤其对于涉及多媒体功能如拍照和播放音乐的应用来说更是如此。本文将深入探讨“android test”这一主题,分析如何有效地利用这些功能进行应用测试。 首先,...

    camera_test.zip

    通过在页面中引入 `camera` 组件,用户可以实时预览摄像头画面,并进行拍照、录像等操作。 3. **相机权限** 在使用 `camera` 组件前,开发者需要在小程序的配置中申请相机权限,确保用户在运行时能够正常访问...

    OV9650_Test.rar_OV9650_TEST.rar_OV9650_Test_wince_wince camera_w

    这个程序可能会启动摄像头,展示实时视频流,并可能提供一些基本的图像处理功能,如拍照、录像或调整摄像头参数。 在Windows CE环境下,驱动程序的开发尤其关键,因为这决定了摄像头如何与系统交互。OV9650的驱动...

    Android 相机控制:自定义相机Test实例.rar

    Android 相机控制:自定义相机Test实例 ,author 孙尚磊,可实现设置相机的各种参数,对焦的方式,照片的类型,对焦监听,拍照成功回调函数,验证手机是否有sdcard,相片预览,相机与SurfaceView绑定,预览的图片...

    ZXJ_TEST.rar

    这个文件可能包含了一系列的程序、脚本或者配置文件,使得用户能够通过编程方式与尼康相机进行交互,比如实现单张拍照、多张连续拍照以及录制视频等功能。 在描述中提到的“尼康照相机控制代码”,这可能涉及到以下...

    Camer Test

    总结来说,"Camer Test"是一个专为Windows CE设计的摄像头测试工具,具备预览、拍照和调整分辨率等功能。它的开发涉及Windows CE的编程知识,包括使用C/C++编程、WinAPI接口调用、GUI设计以及资源管理等技术。源代码...

    PhoneTest摄像头测试源码

    2. **安卓摄像头**:Android系统提供了丰富的API供开发者使用,包括选择摄像头、调整参数、拍照、录制视频等。此源码将展示如何正确地使用这些接口。 3. **AndroidStudio3.5**:这是Google官方推荐的Android应用...

    camera preview test sample

    当新的预览帧可用时,回调函数会被调用,这样开发者就可以对图像数据进行处理,例如拍照、图像分析等。在这个测试样本中,按钮的点击事件可能触发设置预览回调,并在用户按下时捕获一帧图像,将其转换为JPEG格式并...

    uvc_mjpeg_test_tool.zip

    3. 拍照保存:用户可以指定时间间隔或触发条件来保存特定帧为JPEG图像文件。 4. 参数调整:可能允许用户调整摄像头的参数,如分辨率、帧率、亮度、对比度等。 5. 自定义配置:根据"readme"文件,用户可能可以了解...

    VC 摄像头拍照DLL

    3. `test.cpp`:这是一个C++源代码文件,可能包含了实现摄像头拍照功能的主体代码。 4. `StdAfx.cpp`:标准预编译头文件,通常包含了预编译的常用头文件,以加快编译速度。 5. `test.def`:定义文件,用于导出DLL中...

    linux命令行拍照工具

    在linux shell中直接运行$testcam /home/test.jpg,使用免驱摄像头拍照,可在home文件夹中生成test.jpg

    wap扫描条码.zip

    手机版通过Js 打开摄像头扫描 ... 2,必须使用指定浏览器(目前我测试过QQ,谷歌,火狐) 3,只支持手机上使用 4,我只实现了拍照和开启前置后置摄像头功能。...test1 能拍照 test2 可以开启前置和后置摄像头。

    test_camare.rar_安卓_安卓相机

    标题“test_camare.rar_安卓_安卓相机”表明这是一个关于安卓平台相机功能的项目压缩包,可能包含了源代码或者示例,用于展示如何在Android应用中实现拍照。下面将详细讨论这两种主要的拍照方式以及图片保存到SD卡的...

    MyCamera2Test.zip

    【标题】"MyCamera2Test.zip" 是一个与Android开发相关的压缩文件,很可能包含了一个使用Android Camera2 API的示例项目。Camera2 API是Android系统提供的高级相机接口,允许开发者更深入地控制摄像头功能,如曝光、...

    照相机模型与现实增强的代码整合版

    通过对`test.py`文件的深入研究,开发者可以学习到如何在Python环境下实现照相机模型与现实增强技术的整合,这对于开发AR应用、游戏或是教育软件都极具价值。此外,这个代码整合版还简化了学习过程,使得初学者能够...

    cam_test.tar.zip_android_android 相机

    "cam_test.tar.zip_android_android 相机"这个压缩包文件很可能包含了一个示例程序,用于演示如何在Android应用中集成相机功能。下面我们将深入探讨Android系统相机的调用方式以及相关知识点。 1. **Android相机API...

    android studio 调用相机拍照,选择相册照片

    在上述代码中,`camera2test`可能是指使用Camera2 API进行更高级的相机控制,Camera2 API提供对相机更底层的访问,可以实现更多自定义功能,如调整曝光、白平衡等。但基础的拍照和选择相册图片功能,使用普通的...

    Android调用手机拍照,将拍照的图片放在指定文件夹中

    在Android开发中,调用手机内置的照相机应用...这个过程涉及到的代码已经在提供的TestPhoto项目中,可以直接导入学习和使用。对于初学者来说,这是一个很好的实践项目,能够帮助理解Android应用开发中的多个核心概念。

Global site tag (gtag.js) - Google Analytics