在Android中专门提供了Camera来处理相机相关的时间,Camera是一个专门用来连接和断开服务的类,Camera下面包括如下几个事件:
- Camera.AutoFocusCallback 自动调焦功能
- Camera.ErrorCallback 错误信息扑捉
- Camera.parameters 相机的属性参数
- Camera.PictureCallback 拍照、产生图片时触发
- Camera.ShutterCallback 快门设置
- Camera.Size 图片的尺寸
要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过Camera.Parameters对相机的一些属性进行设置,比如输出图片的格式,大小等。使用Camera科技型的操作,如下:
方法 说明
autoFocus 设置自动对焦
getParameters 得到相机的参数
open 启动相机服务
release 释放Camera服务
setParameters 设置预览的参数
setPreviewDisplay 设置预览
startpreview 开始预览
stopPreview 停止预览
takePicture 拍照
这里重点说明一下拍照的方法和使用,takepicture方法要实现3个回调函数,分别是:Camera.ShutterCallback(快门)和两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback的onPictureTaken方法。onPictureTaken中第一个参数就是图像数据,第二个参数则是相机。
下面看一个通过相机拍照的例子,相机需要一个界面来预览当前的拍摄效果,这里可以使用SurfaceView类。
package com.yarin.android.Examples_07_06;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
public class Activity01 extends Activity
{
private Preview mPreview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// Create our Preview view and set it as the content of our activity.
mPreview = new Preview(this);
setContentView(mPreview);
}
public boolean onKeyUp(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_DPAD_CENTER:
mPreview.takePicture();
break;
}
return true;
}
}
/* Preview-显示Preview */
class Preview extends SurfaceView implements SurfaceHolder.Callback
{
SurfaceHolder mHolder;
Camera mCamera;
Bitmap CameraBitmap;
Preview(Context context)
{
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder)
{
/* 启动Camera */
mCamera = Camera.open();
try
{
mCamera.setPreviewDisplay(holder);
}
catch (IOException exception)
{
/* 释放mCamera */
mCamera.release();
mCamera = null;
// TODO: add more exception handling logic here
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{
/* 停止预览 */
mCamera.stopPreview();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
/* 构建Camera.Parameters对相机的参数进行设置 */
Camera.Parameters parameters = mCamera.getParameters();
/* 设置拍照的图片格式 */
parameters.setPictureFormat(PixelFormat.JPEG);
/* 设置Preview的尺寸 */
parameters.setPreviewSize(320, 480);
/* 设置图像分辨率 */
//parameters.setPictureSize(320, 480);
/* 设置相机采用parameters */
mCamera.setParameters(parameters);
/* 开始预览 */
mCamera.startPreview();
}
/* 拍照片 */
public void takePicture()
{
if (mCamera != null)
{
mCamera.takePicture(null, null, jpegCallback);
}
}
/* 拍照后输出图片 */
private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle JPEG image data
CameraBitmap = BitmapFactory.decodeByteArray(_data, 0, _data.length);
File myCaptureFile = new File("/sdcard/camera1.jpg");
try
{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
CameraBitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
/* 将拍到的图片绘制出来 */
Canvas canvas= mHolder.lockCanvas();
canvas.drawBitmap(CameraBitmap, 0, 0, null);
mHolder.unlockCanvasAndPost(canvas);
}
catch (Exception e)
{
e.getMessage();
}
}
};
}
分享到:
相关推荐
以上是自定义带有取景框的Android相机的主要步骤和知识点,实际开发中可能需要根据具体需求进行更深入的定制,例如添加滤镜效果、人脸识别等功能。理解并掌握这些知识,将有助于你创建出更加个性化的相机应用。
在Android应用开发中,创建一个自定义相机以实现身份证扫描功能是常见的需求。这涉及到对Android系统的相机API的深入理解和自定义布局设计。本篇将详细介绍如何构建这样一个系统,主要针对Android 6.0(API级别23)...
深入研究这些源码,开发者不仅可以理解Android相机系统的运行机制,还能学习到如何优化相机功能,开发自定义相机应用,或者为新的硬件平台编写适配器。这个压缩包提供的"Camerase4.1相机"文件应该包含上述提到的关键...
在Android平台上,自定义相机是一项常见的需求,它允许开发者创建具有独特功能和界面设计的拍照应用。本教程将深入探讨如何在Android应用中实现自定义相机功能,包括使用Camera API和CameraX库。 首先,我们要了解...
《Android 7.0相机源码解析》 在Android系统中,相机功能是不可或缺的一部分,它为用户提供了捕捉生活...通过对源码的研究,开发者可以深入了解Android相机框架的工作原理,从而定制自己的相机应用,提升用户体验。
在Android 4.0.3(Ice Cream Sandwich)版本中,照相机功能是系统的核心组件之一,对于开发者来说,理解其源码可以帮助我们深入学习Android系统以及如何构建高性能、功能丰富的相机应用。以下是对Android 4.0.3照相机...
在Android平台上,自定义相机(CameraDIY)是开发者经常遇到的需求,特别是在创建涉及多媒体功能的...通过对这个项目的分析和学习,开发者可以深入了解Android相机API的使用,为自己的应用增添更多个性化的相机功能。
在Android开发中,有时我们需要对系统默认的相机功能进行扩展,以满足特定的拍摄需求,例如只拍摄画面中的矩形区域。这样的自定义相机功能可以应用于各种场景,比如二维码扫描、文档拍摄等,确保用户每次拍摄都能...
在Android开发中,自定义相机是一项常见的需求,但往往伴随着各种设备兼容性问题。本文将深入探讨一个特定的问题——在某些设备(如HTC)上,自定义相机可能导致黑屏的现象,以及如何解决这个问题。 首先,问题的...
在Android开发中,有时我们可能需要创建一个独特的用户体验,比如设计一个圆形的相机预览窗口。这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 ...
在Android平台上,开发一...总结来说,这个项目展示了如何利用Android原生接口实现相机预览和人脸检测,涵盖了Android相机API的使用、图像处理、坐标转换、界面绘制等多个技术点,是Android开发中的一个重要实践案例。
在Android平台上,调用相机功能是开发者经常遇到的需求。针对Android 2.3.3(API级别10)这一版本,有三种主要的相机调用方法。本文将详细阐述这三种方式,帮助开发者更好地理解和应用。 1. **使用Intent启动系统...
在Android平台上,自定义相机功能是一项常见的需求,尤其对于那些希望提供独特拍摄体验的应用开发者来说。本教程将探讨如何在Android应用中实现自定义相机的连拍功能,这对于摄影爱好者或者需要快速捕捉连续图像的...
以上是关于“Xamarin.Android相机使用实例源码及水印菜单”的主要知识点。通过学习和实践这个实例,开发者能够掌握如何在Xamarin环境中集成和定制相机功能,以及如何处理图像和添加水印,进一步提升应用的功能性和...
本篇文章将深入探讨如何创建一个基本的Android相机拍照应用,并着重讲解如何针对不同手机设备调整图片尺寸。 首先,我们需要了解Android的Camera API。Android系统提供了一个名为`Camera`的类,用于访问和控制手机...
在Android开发中,自定义相机是一项常见的需求,它允许开发者根据特定的应用场景或者设计风格定制相机界面和功能。本文将详细讲解如何使用Camera API和Camera2 API...不断学习和实践,才能更好地掌握Android相机开发。
在Android开发中,调用系统相机以及自定义相机功能是常见的需求,特别是在涉及到图像拍摄和处理的应用中。本文将深入探讨如何实现这一功能,并重点介绍如何创建一个具有圆形取景框的自定义相机。 首先,调用系统...
在Android开发中,自定义相机是一项常见的需求,它允许开发者根据特定的应用场景和用户体验来定制相机功能。本文将深入探讨如何在Android应用中实现自定义相机,并特别关注切换前后摄像头以及进行拍照的功能。 首先...
这个demo可能包含了设置预览界面、处理拍照事件、保存图片到设备存储等功能的示例代码,是学习Android相机开发的好起点。 总之,Android自定义相机涉及到许多关键点,包括权限管理、相机实例的获取与释放、预览设置...
一个常见的需求是H5页面能够调用Android设备的相机进行拍照,以实现更丰富的用户体验。本知识点将详细阐述如何在H5中调用Android本地相机进行拍照,并确保在Android 5.0、6.0等不同版本系统上的兼容性。 首先,我们...