`

android多媒体学习笔记二

阅读更多


实现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学习笔记

    ### Android学习笔记 #### 1. Android概述 **1.1 Android的特性** - **应用框架**:Android提供了一个强大的应用框架,使得开发者能够轻松地重用基础组件和服务,简化了应用程序的开发流程。 - **Dalvik虚拟机**...

    Android学习笔记.doc Android学习笔记.doc

    【Android学习笔记】 Android平台是谷歌推出的一个开放源代码的移动设备操作系统,它为开发者提供了一个全面的软件包,包括操作系统、中间件和关键应用程序。这个平台的主要目标是促进移动应用的创新和多样性,允许...

    Android_学习笔记.zip

    这个"Android_学习笔记.zip"文件很可能包含了一个详细的Android开发学习路径和关键知识点的总结。下面将基于这个主题,详细讲解Android开发的一些核心概念和技术。 首先,Android是Google开发的一款开源操作系统,...

    android\Android学习笔记

    ### Android学习笔记精要 #### 一、Android平台概述与特性 Android平台是谷歌推出的针对移动设备的操作系统,集成了操作系统、中间件和关键应用程序,为开发者提供了完整的开发环境。其核心特性包括: 1. **应用...

    android 学习笔记(全全整理)

    Android学习笔记全全整理,是针对想要深入理解并掌握Android开发技术的学习者们的一份宝贵资源。这份笔记涵盖了从基础到高级的多个方面,旨在帮助读者建立起完整的Android知识体系。以下将详细介绍其中可能包含的...

    android初级学习笔记

    在学习 Android 开发的过程中,理解 Activity 的生命周期、熟练掌握各种布局的使用、熟悉资源管理以及学会处理多媒体数据是至关重要的。随着经验的积累,你将能够开发出功能丰富的 Android 应用程序。

    MONO FOR ANDROID学习笔记全套

    【Mono for Android学习笔记全套】是一份详尽的资源,旨在帮助开发者掌握使用Mono和C#进行Android应用开发的技术。Mono是.NET框架的一个开源实现,它使得C#开发者能够在多种平台上,包括Android,编写和运行应用程序...

    很好的android学习笔记

    【Android学习笔记】 Android是一种基于Linux内核的开源操作系统,主要应用于移动设备,如智能手机和平板电脑。这个“很好的android学习笔记”包含了作者在学习Android开发过程中积累的宝贵经验,旨在帮助初学者或...

    java、linux、Android 学习笔记

    【Android学习笔记】 Android是一个开源的移动操作系统,主要应用于智能手机和平板电脑。它由Google主导并开源,基于Linux内核。学习Android开发,你需要熟悉Java或Kotlin语言,理解Android SDK、Android Studio...

    android学习笔记1

    "Android学习笔记1"这个压缩包文件很可能是开发者在实践中积累的经验和代码示例的集合,对于初学者和有经验的开发者来说,都是宝贵的资源。这里,我们将深入探讨Android开发的一些关键概念和技术。 首先,Android是...

    Android学霸学习笔记

    根据提供的文件内容,这是一份详细的Android学习笔记,涵盖了从基础入门到高级特性的各个知识点。以下是从这些内容中提取的知识点: 1. Android入门基础: - 建立第一个App:介绍如何创建Android项目和执行程序。 ...

    黎活明Android学习笔记

    根据给定的信息,“黎活明Android学习笔记”主要记录了Android开发的基础步骤和技术要点,包括安装Android开发环境、创建虚拟设备、构建简单的Android应用程序以及理解应用程序的目录结构等内容。接下来,我们将对...

    Android开发教程笔记完全版.zip

    以上只是Android开发教程笔记可能涵盖的部分内容,具体的学习过程中还会涉及更多高级主题,如动画、通知、推送服务、多媒体处理、蓝牙通信、安全性、国际化等。这份完全版的教程应该会详细讲解这些知识点,并提供...

    Android学习笔记总结初学者必看.rar_Android java_android

    在Android学习之旅中,初学者会遇到各种概念和实践技巧,这份"Android学习笔记总结初学者必看"的文档正是为了帮助他们系统性地掌握这一领域。以下是对这份压缩包内容的详细解读。 首先,Android是由Google开发的一...

    Android学习笔记(入门必看)

    ### Android学习笔记(入门必看) #### 一、Android简介 **Android** 是一个开源的操作系统,主要用于智能手机和平板电脑等移动设备。它由Google公司维护,并基于Linux内核进行开发。Android平台不仅包括操作系统...

    Android study notes 安卓学习笔记

    【Android学习笔记】是针对Android开发者的详尽学习资源,涵盖了Android开发的基础到高级概念,旨在帮助初学者和有经验的开发者深入理解Android操作系统的工作原理和应用开发技术。以下是一些核心知识点的概述: 1....

    Android 系统相关学习笔记.zip

    在Android系统相关学习笔记中,我们可以深入探讨这个广泛而复杂的移动操作系统的核心概念和技术。Android以其开源性和灵活性,吸引了大量的开发者和爱好者。以下是一些关键的知识点: 1. **Android架构**:Android...

Global site tag (gtag.js) - Google Analytics