现在的手机几乎都实现照相机功能了,而且在硬件的支持下像素也越来越高,在现实生活中的用途也越来越广,而在Android中专门 提供了Camera来处理相机相关的事件,Camera 是一个专门用来连接和断开相机服务的类,Camera 下面包括如下几个事件:
Camera.AutoFocusCallback: 自动调焦功能;
Camera.ErrorCallback:错误信息捕捉;
Camera.Parameters :相机的属性参数
Camera.PictureCallback:拍照、产生图片时触发;
Camera.PreviewCallback:相机预览设置;
Camera.ShutterCallback:快门设置;
Camera.Size:图片尺寸;
要在Android中使用相机服务很简单,Camera没有构造方法,我们要使用它直接通过open()方法来打开相机设备,然后通过 Camera.Parameters 对相机的一些属性进行设置,比如输出图片的格式、大小等等。下面是Camera类一些常用的方法介绍。
Camera类的方法
方法 说明
autoFocus 设置自动对焦
getParameters 得到相机的参数
open 启动相机服务
release 释放Camera服务
setPreviewDisplay 设置预览
setParameters 设置预览参数
startPreview 开始预览
stopPreview 停止预览
takePicture 拍照
这里重点说明一下拍照的方法和使用, takePicture 方法要实现3个回调函数,分别是: Camera.ShutterCallback (快门) 和 两个Camera.PictureCallback(图像数据)。这里我们在拍照之后要取得图像数据就需要实现Camera.PictureCallback 的 onPictureTaken 方法。onPictureTaken 中第一个参数就是图像数据, 第二个参数则是相机。
下面是一个相机拍照的例子。相机需要一个界面来预览当前拍摄的效果,这里可以使用SurfaceView类。 我们先来看看在模拟器上的运行效果吧。
下面我们来看具体如何使用相机服务预览效果,最后按导航键中键来拍照,将照片保存到SD卡中(当然首先要确认有SD卡插入)。 代码如下
Activity01类
package xiaohang.zhimeng;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
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;
@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;
public Preview(Context context) {
super(context);
//得到SurfaceHolder对象
mHolder = getHolder();
//添加回调函数
mHolder.addCallback(this);
//设置SurfaceHolder 的类型
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
//在Surface的大小发生改变时激发
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
/*构建Camera.Parameters对相机的参数进行设置*/
Camera.Parameters parameters = mCamera.getParameters();
/*设置拍照的图片格式*/
parameters.setPictureFormat(PixelFormat.JPEG);
/*设置Preview(预览)的尺寸*/
parameters.setPreviewSize(320, 480);
mCamera.setParameters(parameters);
/*开始预览*/
mCamera.startPreview();
}
/*拍照片*/
public void takePicture(){
if (mCamera != null) {
mCamera.takePicture(null, null, jpegCallback);
}
}
/*拍照后输出图片*/
private PictureCallback jpegCallback = new PictureCallback(){
@Override
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));
//压缩位图到指定的OutputStream
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();
}
}
};
//在创建Surface时激发
@Override
public void surfaceCreated(SurfaceHolder holder) {
/*启动Camera*/
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (Exception e) {
/*释放mCamera*/
mCamera.release();
mCamera = null;
}
}
//在销毁Surface时激发
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
/*停止预览*/
mCamera.stopPreview();
mCamera = null;
}
}
最后大家不要忘记了加上权限声明
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
源码见附件
- 大小: 37.9 KB
分享到:
相关推荐
1. **Android相机API**: - 在Android中,我们可以使用`Camera`类或`Camera2` API来访问和控制设备的相机。然而,由于`Camera`类已被弃用,现在推荐使用`Camera2` API,它提供了更高级别的控制和更好的性能。 - ...
以上是自定义带有取景框的Android相机的主要步骤和知识点,实际开发中可能需要根据具体需求进行更深入的定制,例如添加滤镜效果、人脸识别等功能。理解并掌握这些知识,将有助于你创建出更加个性化的相机应用。
一个常见的需求是H5页面能够调用Android设备的相机进行拍照,以实现更丰富的用户体验。本知识点将详细阐述如何在H5中调用Android本地相机进行拍照,并确保在Android 5.0、6.0等不同版本系统上的兼容性。 首先,我们...
本资源"android照相机应用源码"提供了一个可以直接运行的Android相机应用示例,这对于初学者和有经验的开发者来说都是一个宝贵的参考资料。 首先,我们需要了解Android相机API的基础知识。在Android 3.0(API级别11...
总之,开发Android相机拍照程序需要理解Camera API,合理设置图片尺寸以适应不同设备,并处理好拍照的整个流程。通过优化和适配,我们可以创建出既满足功能需求,又能良好运行在各种设备上的拍照应用。
CameraChecker 与此应用程序一起快速检查Android相机设置! 使用这个有用的工具来应对难以处理的Android相机碎片。如何使用使用Gradle构建并安装到目标设备。 运行应用程序。
在Android平台上,开发一款应用,实现自定义相机功能并让拍照界面呈现出圆形拍摄框,是一项技术挑战。这个功能常用于创建类似Instagram或某些社交应用的个性化拍摄体验,让用户拍摄的照片中心区域聚焦为圆形,增强...
本文将深入探讨“android的相机设置源码”所涵盖的知识点,帮助开发者理解并掌握Android相机API的使用。 一、Android相机框架 Android系统提供了Camera API,分为两个版本:Camera1和Camera2。Camera1是早期的API...
在Android开发中,自定义相机是一项常见的需求,但往往伴随着各种设备兼容性问题。本文将深入探讨一个特定的问题——在某些设备(如HTC)上,自定义相机可能导致黑屏的现象,以及如何解决这个问题。 首先,问题的...
android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo
`android-Camera-Code.zip`是一个实用的Android相机应用示例,涵盖了基本的相机预览、拍照和参数设置。通过学习和分析这个示例,开发者可以快速掌握Android相机功能的开发,为自己的应用添加丰富的相机特性。同时,...
以上是关于“Xamarin.Android相机使用实例源码及水印菜单”的主要知识点。通过学习和实践这个实例,开发者能够掌握如何在Xamarin环境中集成和定制相机功能,以及如何处理图像和添加水印,进一步提升应用的功能性和...
这些信息对于理解和调整相机设置至关重要。 5. **CaptureRequest**: CaptureRequest是创建拍照或录像请求的关键类。开发者可以在这个请求中设置各种参数,如曝光时间、感光度、测光模式等,并通过...
深入研究这些源码,开发者不仅可以理解Android相机系统的运行机制,还能学习到如何优化相机功能,开发自定义相机应用,或者为新的硬件平台编写适配器。这个压缩包提供的"Camerase4.1相机"文件应该包含上述提到的关键...
在Android开发中,相机功能是不可或缺的一部分,无论是用于拍摄照片还是录制视频,它都是移动应用中的常用特性。本文将深入探讨如何在Android中调用系统...希望这个Demo源码能帮助你更好地理解和实践Android相机功能。
总结,这个“Android 相机、图库Demo”是学习和实践Android相机和图库功能的好资源,涵盖了从启动系统服务到自定义相机界面,再到处理返回结果的各种技术点。开发者可以根据这些示例代码,快速地在自己的应用中集成...
一、Android相机API基础 在Android中,相机功能主要通过`Camera`类和`Camera2` API来实现。`Camera`类是早期版本Android中的相机接口,虽然现在已经被`Camera2` API取代,但在许多旧设备上仍然广泛使用。`Camera2` ...
这涉及到在布局文件中添加`SurfaceView`,它是Android相机预览的承载者。`SurfaceView`可以在后台线程中处理图像数据,保证流畅的预览体验。我们还需要监听`SurfaceHolder`的回调事件,如`SurfaceCreated`、`...
在Android平台上,自定义相机(CameraDIY)是开发者经常遇到的需求,特别是在创建涉及多媒体功能的...通过对这个项目的分析和学习,开发者可以深入了解Android相机API的使用,为自己的应用增添更多个性化的相机功能。