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();
}
}
分享到:
相关推荐
通过"Android Camera Test Case",我们可以全面评估和优化Android手机的相机功能,为用户提供更优质的拍照和录像体验。而"camera_test"可能是一个包含这些测试用例的文件或脚本,用于自动化执行和记录测试结果。在...
在Android平台上进行测试是开发过程中不可或缺的一环,尤其对于涉及多媒体功能如拍照和播放音乐的应用来说更是如此。本文将深入探讨“android test”这一主题,分析如何有效地利用这些功能进行应用测试。 首先,...
通过在页面中引入 `camera` 组件,用户可以实时预览摄像头画面,并进行拍照、录像等操作。 3. **相机权限** 在使用 `camera` 组件前,开发者需要在小程序的配置中申请相机权限,确保用户在运行时能够正常访问...
这个程序可能会启动摄像头,展示实时视频流,并可能提供一些基本的图像处理功能,如拍照、录像或调整摄像头参数。 在Windows CE环境下,驱动程序的开发尤其关键,因为这决定了摄像头如何与系统交互。OV9650的驱动...
Android 相机控制:自定义相机Test实例 ,author 孙尚磊,可实现设置相机的各种参数,对焦的方式,照片的类型,对焦监听,拍照成功回调函数,验证手机是否有sdcard,相片预览,相机与SurfaceView绑定,预览的图片...
这个文件可能包含了一系列的程序、脚本或者配置文件,使得用户能够通过编程方式与尼康相机进行交互,比如实现单张拍照、多张连续拍照以及录制视频等功能。 在描述中提到的“尼康照相机控制代码”,这可能涉及到以下...
总结来说,"Camer Test"是一个专为Windows CE设计的摄像头测试工具,具备预览、拍照和调整分辨率等功能。它的开发涉及Windows CE的编程知识,包括使用C/C++编程、WinAPI接口调用、GUI设计以及资源管理等技术。源代码...
2. **安卓摄像头**:Android系统提供了丰富的API供开发者使用,包括选择摄像头、调整参数、拍照、录制视频等。此源码将展示如何正确地使用这些接口。 3. **AndroidStudio3.5**:这是Google官方推荐的Android应用...
当新的预览帧可用时,回调函数会被调用,这样开发者就可以对图像数据进行处理,例如拍照、图像分析等。在这个测试样本中,按钮的点击事件可能触发设置预览回调,并在用户按下时捕获一帧图像,将其转换为JPEG格式并...
3. 拍照保存:用户可以指定时间间隔或触发条件来保存特定帧为JPEG图像文件。 4. 参数调整:可能允许用户调整摄像头的参数,如分辨率、帧率、亮度、对比度等。 5. 自定义配置:根据"readme"文件,用户可能可以了解...
3. `test.cpp`:这是一个C++源代码文件,可能包含了实现摄像头拍照功能的主体代码。 4. `StdAfx.cpp`:标准预编译头文件,通常包含了预编译的常用头文件,以加快编译速度。 5. `test.def`:定义文件,用于导出DLL中...
在linux shell中直接运行$testcam /home/test.jpg,使用免驱摄像头拍照,可在home文件夹中生成test.jpg
手机版通过Js 打开摄像头扫描 ... 2,必须使用指定浏览器(目前我测试过QQ,谷歌,火狐) 3,只支持手机上使用 4,我只实现了拍照和开启前置后置摄像头功能。...test1 能拍照 test2 可以开启前置和后置摄像头。
标题“test_camare.rar_安卓_安卓相机”表明这是一个关于安卓平台相机功能的项目压缩包,可能包含了源代码或者示例,用于展示如何在Android应用中实现拍照。下面将详细讨论这两种主要的拍照方式以及图片保存到SD卡的...
【标题】"MyCamera2Test.zip" 是一个与Android开发相关的压缩文件,很可能包含了一个使用Android Camera2 API的示例项目。Camera2 API是Android系统提供的高级相机接口,允许开发者更深入地控制摄像头功能,如曝光、...
通过对`test.py`文件的深入研究,开发者可以学习到如何在Python环境下实现照相机模型与现实增强技术的整合,这对于开发AR应用、游戏或是教育软件都极具价值。此外,这个代码整合版还简化了学习过程,使得初学者能够...
"cam_test.tar.zip_android_android 相机"这个压缩包文件很可能包含了一个示例程序,用于演示如何在Android应用中集成相机功能。下面我们将深入探讨Android系统相机的调用方式以及相关知识点。 1. **Android相机API...
在上述代码中,`camera2test`可能是指使用Camera2 API进行更高级的相机控制,Camera2 API提供对相机更底层的访问,可以实现更多自定义功能,如调整曝光、白平衡等。但基础的拍照和选择相册图片功能,使用普通的...
在Android开发中,调用手机内置的照相机应用...这个过程涉及到的代码已经在提供的TestPhoto项目中,可以直接导入学习和使用。对于初学者来说,这是一个很好的实践项目,能够帮助理解Android应用开发中的多个核心概念。