- 浏览: 261276 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
实现SurfaceHolder.Callback ,PictureCallback接口
预览service
/**
* 实例化按件
*/
private void findView() {
cameraView = (SurfaceView) this.findViewById(R.id.sfv_camera_view);
cameraView.setFocusable(true);
cameraView.setFocusableInTouchMode(true);
cameraView.setClickable(true);
cameraView.setOnClickListener(this);
surfaceHolder = cameraView.getHolder();
// 推送类型的surfaceView,缓冲区由Camera类来管理
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 设置回调函数
surfaceHolder.addCallback(this);
}
/***********************************************/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 取得 camera对象
camera = Camera.open();
try {
// 设置camera对象的参数
// 设置camera对象采用纵向方向
Parameters parameters = camera.getParameters();
// 设置闪光灯模式
// 修改效果
// 列出常用效果:none mono negative sepia
// 类似的常量还有抗条带(antibanding) 闪光灯(flash mode)聚焦模式(focus mode)情景模式(scen
// mode) 白平衡(white balance)
List<String> colorEffects = parameters.getSupportedColorEffects();
Iterator<String> cei = colorEffects.iterator();
while (cei.hasNext()) {
String currentEffect = cei.next();
Log.i("tag", "checking:" + currentEffect);
// 使用过渡爆光
if (currentEffect.equals(Camera.Parameters.EFFECT_SOLARIZE)) {
Log.i("tag", "using SOLARIZE");
parameters.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE);
break;
}
}
// 检查当前屏幕的方向
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
// 一个未文档化的特性
parameters.set("orientation", "portrait");
// 对于2.2以上的版本
camera.setDisplayOrientation(90);
} else {
parameters.set("orientation", "landscape");
camera.setDisplayOrientation(0);
}
// 设置预览大小,接近但不超过一对常量的大小
/* int bestWidth = 0;
int bestHeight = 0;
List<Size> previewSize = parameters.getSupportedPreviewSizes();
if (previewSize.size() > 1) {
Iterator<Size> iterator = previewSize.iterator();
while (iterator.hasNext()) {
Size cameraSize = iterator.next();
Log.i("tag", "checking:" + cameraSize.width + " x " + cameraSize.height);
if (cameraSize.width > bestWidth && cameraSize.width <= LARGEST_WIDTH && cameraSize.height > bestHeight && cameraSize.height <= LARGEST_HEIGHT) {
bestHeight = cameraSize.height;
bestWidth = cameraSize.width;
cameraView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight));
}
}
}
if (bestHeight != 0 && bestWidth != 0) {
Log.i("tag", "Using :" + bestWidth + " x " + bestHeight);
parameters.setPreviewSize(bestWidth, bestHeight);
}*/
camera.setParameters(parameters);
// 设置预览
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
Log.i("tag", e.toString());
// 释放camera对象
camera.release();
}
// 启动摄像头预览
// 此时的预览图像会逆时针旋转90度,原因是camera对象假定方向是水平 或是横向模式
// 最简单的修复方法是使活动以横向模式显示
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
camera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 停止预览
camera.stopPreview();
// 释放camera对象
camera.release();
}
/**
* 捕获和保存图像PictureCallback
*
* 其他的回调方法
*
* 1 PreviewCallback 当存在预览帧时调用
*
* 三种使用方法:
*
* setPreviewCallback 在屏幕上显不一个新的预览帖时调用onPictureFream
*
* setOneShotPreviewCallback 当下预览图像可用时调用
*
* setPreviewCallbackWithBuffer 指定一个字节数组作为缓冲区,用于预览图像
*
* 2 AutoFocusCallback 完成一个自动聚焦是调用
*
* 3 ErrorCallback 发生一个错误时调用
*
* 4 OnZoomChangeListener 放大/缩小时调用
*
* 5 ShutterCallback 当捕获图像时调用
*
* @data 图像数据的字节数组
* @camera camera的对象引用
*/
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 保存相片
Uri imageFileUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());
try {
OutputStream imageFileOS = getContentResolver().openOutputStream(imageFileUri);
imageFileOS.write(data);
imageFileOS.flush();
imageFileOS.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 可以理新元数据
ContentValues contentValues = new ContentValues(3);
contentValues.put(Media.DISPLAY_NAME, "this is a test title");
contentValues.put(Media.DESCRIPTION, "this is a test description");
getContentResolver().update(imageFileUri, contentValues, null, null);
}
/**
* 重写点击事件
*/
@Override
public void onClick(View v) {
camera.takePicture(null, null, this);
}
发表评论
-
android多媒体学习笔记一
2012-09-04 10:47 7271 使用内置的camera应用程序捕获图像 /*** ... -
android多媒体学习笔记三___图像合成
2012-09-05 11:36 627/** * 图像合成 * * @time 下午06:21 ... -
android多媒体部分学习笔记四___ Matrix
2012-09-05 11:40 730/*** 图像的缩放和旋转 Matrix** 1 0 0 x= ... -
android多媒体部分学习笔记五----audio
2012-09-08 16:08 720/*** 打开内置音乐播放器*/private void ge ... -
android多媒体部分学习笔记六----音频录制 mediaRecorder
2012-09-08 16:12 686/** * * 使用意图捕获音频 * * @time ... -
android多媒体部分学习笔记七------音频录制 mediaRecorder
2012-09-08 16:13 764/** * 自定义捕获音频 * * @time 下午12 ... -
android多媒体部分学习笔记八------音频录制 mediaRecorder
2012-09-08 16:14 779/** * 原始音频的播放和录制 * * audio ... -
android 多媒体部分学习笔记九----数字音频合成
2012-09-09 12:43 875/** * 数字音频合成 * * @time 下午12: ... -
android 多媒体部分学习笔记十 可视化频率(频谱)
2012-09-09 23:43 3238/** * 可视化频率 * * @time 下午12 ... -
android 多媒体部分学习笔记十--简单视频播放
2012-09-10 17:53 773/** * 简单播放 * * @time 下午05:15 ... -
android 多媒体部分学习笔记十二----mediaplay自定义播放器
2012-09-10 22:31 1704/** * * 自定义播放器 * * @time 下午 ... -
android 多媒体部分学习笔记十三----mediaStore 检索视频
2012-09-12 00:12 1028/** * mediaStore检索视频 * * @ti ... -
android 多媒体部分学习十四---网络视频播放(http/rtsp)
2012-09-12 14:36 1847/** * 网络视频播放 * * openCore * ... -
android 多媒体部分学习笔记十五-----视频录制
2012-09-12 15:02 777/** * 调用系统视频录制 * * @time 下午0 ...
相关推荐
这个"Android_学习笔记.zip"文件很可能包含了一个详细的Android开发学习路径和关键知识点的总结。下面将基于这个主题,详细讲解Android开发的一些核心概念和技术。 首先,Android是Google开发的一款开源操作系统,...
Android学习笔记全全整理,是针对想要深入理解并掌握Android开发技术的学习者们的一份宝贵资源。这份笔记涵盖了从基础到高级的多个方面,旨在帮助读者建立起完整的Android知识体系。以下将详细介绍其中可能包含的...
在学习 Android 开发的过程中,理解 Activity 的生命周期、熟练掌握各种布局的使用、熟悉资源管理以及学会处理多媒体数据是至关重要的。随着经验的积累,你将能够开发出功能丰富的 Android 应用程序。
【Mono for Android学习笔记全套】是一份详尽的资源,旨在帮助开发者掌握使用Mono和C#进行Android应用开发的技术。Mono是.NET框架的一个开源实现,它使得C#开发者能够在多种平台上,包括Android,编写和运行应用程序...
【Android学习笔记】 Android是一种基于Linux内核的开源操作系统,主要应用于移动设备,如智能手机和平板电脑。这个“很好的android学习笔记”包含了作者在学习Android开发过程中积累的宝贵经验,旨在帮助初学者或...
【Android学习笔记】 Android是一个开源的移动操作系统,主要应用于智能手机和平板电脑。它由Google主导并开源,基于Linux内核。学习Android开发,你需要熟悉Java或Kotlin语言,理解Android SDK、Android Studio...
"Android学习笔记1"这个压缩包文件很可能是开发者在实践中积累的经验和代码示例的集合,对于初学者和有经验的开发者来说,都是宝贵的资源。这里,我们将深入探讨Android开发的一些关键概念和技术。 首先,Android是...
根据提供的文件内容,这是一份详细的Android学习笔记,涵盖了从基础入门到高级特性的各个知识点。以下是从这些内容中提取的知识点: 1. Android入门基础: - 建立第一个App:介绍如何创建Android项目和执行程序。 ...
根据给定的信息,“黎活明Android学习笔记”主要记录了Android开发的基础步骤和技术要点,包括安装Android开发环境、创建虚拟设备、构建简单的Android应用程序以及理解应用程序的目录结构等内容。接下来,我们将对...
以上只是Android开发教程笔记可能涵盖的部分内容,具体的学习过程中还会涉及更多高级主题,如动画、通知、推送服务、多媒体处理、蓝牙通信、安全性、国际化等。这份完全版的教程应该会详细讲解这些知识点,并提供...
在Android学习之旅中,初学者会遇到各种概念和实践技巧,这份"Android学习笔记总结初学者必看"的文档正是为了帮助他们系统性地掌握这一领域。以下是对这份压缩包内容的详细解读。 首先,Android是由Google开发的一...
【Android学习笔记】是针对Android开发者的详尽学习资源,涵盖了Android开发的基础到高级概念,旨在帮助初学者和有经验的开发者深入理解Android操作系统的工作原理和应用开发技术。以下是一些核心知识点的概述: 1....
在Android系统相关学习笔记中,我们可以深入探讨这个广泛而复杂的移动操作系统的核心概念和技术。Android以其开源性和灵活性,吸引了大量的开发者和爱好者。以下是一些关键的知识点: 1. **Android架构**:Android...