Android多媒体开发:照相机
一、调用系统照相机和摄像机功能
调用系统摄像头进行拍照和摄像是通过隐式启动系统Activity 实现的,无需给自己的工程添加权限,直接调用即可。因此我们只需知道系统照相机和摄像机Activity 的action 和category 就可以了
步骤
1、打开Android 源码,查看”\packages\apps\”文件文件目录下的Camera 应用,即系统摄像头的应用程序。打开其清单文件文件,查看其Activity 的action 和category 信息
2、Camera 类的action 和category 如下
照相机的意图过滤器
<intent-filter><action android:name="android.media.action.IMAGE_CAPTURE" /><category android:name="android.intent.category.DEFAULT" />
</intent-filter>
摄像机的意图过滤器
<intent-filter><action android:name="android.media.action.VIDEO_CAMERA" /><category android:name="android.intent.category.DEFAULT" />
</intent-filter>
3、采用隐式调用的方式调用Activity
由于希望在调用拍照或摄像功能后将结果返回到当前应用的Activity,所以在开启Activity 时不能使用startActivity 方法,而是使用startActivityForResult 方法开启Activity,并重写onActivityResult 方法处理回传的数据
布局文件比较简单,界面只有两个按钮,一个用于打开照相机,一个用于打开摄像机。这里只给出核心代码清单
拍照功能核心代码
public void take(View view){//创建一个Intent 对象Intent intent = new Intent();//设置Actionintent.setAction("android.media.action.IMAGE_CAPTURE");//创建一个文件File file = newFile(Environment.getExternalStorageDirectory().getAbsolutePath(),"my.jpg");//创建uri 对象Uri uri = Uri.fromFile(file);//设置图片的输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//开启ActivitystartActivityForResult(intent, 100);}
摄像功能核心代码
public void video(View view){Intent intent = new Intent();intent.setAction("android.media.action.VIDEO_CAPTURE");File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"myVedio.mp4");Uri uri = Uri.fromFile(file);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, 101);
}
二、编码实现照相功能
使用Camera+SurfaceView 控件可实现自定义照相机功能。接下来我将具体的步骤展示出来
1、编写布局文件,该布局只有一个SurfaceView 控件和一个Button 作为拍照按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><SurfaceView
android:id="@+id/sv"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><Button
android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="takeImage"android:text="拍照"/></LinearLayout>
2、在清单文件中添加2 个权限信息
添加第一个权限是因为我们代码使用到系统照相机,第二个是因为我们需要把照好的相片保存到sdcard 上
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//声明成员变量private Camera camera;//照相机对象private SurfaceHolder holder;//SurfaceView 的辅助类//获取SurfaceView 控件的实例,通过其辅助类SurfaceHolder 对象添加CallBack 接口的实现//获取预览画面的SurfaceView 控件SurfaceView surfaceView = (SurfaceView) findViewById(R.id.sv);//得到预览画面的辅助类holder = surfaceView.getHolder();//添加回调方法holder.addCallback(new Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {//打开摄像头camera = Camera.open();//设置预览显示的位置camera.setPreviewDisplay(holder);//开启预览camera.startPreview();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {//停止预览界面camera.stopPreview();//释放摄像头camera.release();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {}//添加点击拍照按钮的点击事件:设置摄像头自动对焦,对焦完成后保存图片并重新预览//拍照public void takeImage(View view) {if (camera == null) {Toast.makeText(this, "照相机还没打开。", Toast.LENGTH_SHORT).show();return;}//点击拍照按钮,摄像头自动对焦,对焦完成后拍照并保存camera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {//对焦完成,拍照并保存camera.takePicture(null, null, new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//设置照片保存路径String path =Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +UUID.randomUUID().toString() + ".jpg";try {FileOutputStream outputStream = new FileOutputStream(path);//将照片字节数组写到文件中outputStream.write(data);outputStream.close();//重新开启预览camera.startPreview();} catch (Exception e) {e.printStackTrace();}}});}});}
三、总结
Camera
方法 | 说明 |
---|---|
open() | 打开摄像头 |
release() | 释放摄像头 |
setPreviewDisplay() | 设置预览显示的位置 |
startPreview() | 开启预览 |
stopPreview() | 停止预览界面 |
autoFocus() | AutoFocusCallback |
takePicture() | 对焦完成 |
Android多媒体开发:照相机相关推荐
- Android多媒体开发
Android多媒体开发系列文章 Android多媒体开发:录音机 Android多媒体开发:照相机 TextureView+MediaPlayer实现在线短视频播放 Android多媒体开发:第三方 ...
- android开发高级开发,Android多媒体开发高级编程 (Shawn Van Every) pdf扫描版
<android多媒体开发高级编程--为智能手机和平板电脑开发图形.音乐.视频和富媒体应用>使用清晰.直观的示例介绍了android sdk中丰富的多媒体功能,有助于您开发能够创建.播放和 ...
- android编程高级教程 pdf,Android多媒体开发高级编程
在多媒体功能方面,今天的手机同时是照相机.相册.摄像机.电影播放器.音乐播放器.听写机,且可能具备更多功能. 特别是,Android在SDK中具有非常丰富的功能,本书将试图通过讨论和实例对该SDK进行 ...
- Android多媒体开发技术
周末参加了线下安卓巴士论坛组织的"安卓开发者的修炼之道",几位嘉宾分享的内容都很赞.没时间整理文字版,直接分享嘉宾的PPT了. 第二位嘉宾何俊林,前爱奇艺多媒体开发,据说活动现场很 ...
- Android多媒体开发介绍
Android多媒体开发介绍 一. 多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3. ...
- Android多媒体开发(3)————使用Android NKD编译havlenapetr-FFMpeg-7c27aa2
1. 使用NDK去编译官方的FFmpeg原版的话,还得自己实现JNI层与Java层,工程量比较大.所以移植FFmpeg到Android平台时,可以移植一些已经实现JNI与JAVA层的开源项目,毕竟软件 ...
- Android多媒体开发-stagefright及AwesomePlayer相关知识梳理
android的多媒体框架中, stagefright其实是AwesomePlayer的代理,就是个皮包公司. status_t StagefrightPlayer::setDataSource( c ...
- Android 多媒体开发 MediaPlayer|SoundPool |MediaRecorder |Camera2| MediaProjectionManager
android支持音频格式: mp3.wav.3gp 视频: MP4.g3p 等等.... 1. MediaPlayer|SoundPool 使用 1.1. MediaPlayer 加载资源 ...
- 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38487967 一. MediaPlayer 状态机 介绍 ...
最新文章
- Python时间转换函数:时间转化为时间戳、时间戳转化为时间、当前日期、当前时间、星期几、前面或者后面多少天、年、月、日等
- mysql 定义存储过程_mysql——定义——存储过程和函数——概念
- JavaScript基础09-day11【原型对象、toString()、垃圾回收、数组、数组字面量、数组方法】
- 深入理解Java幂等性
- Git的smart Checkout\force checkout\Don‘t Checkout的区别
- app.config数据库路径问题
- Split Byte(文件分割助手) v2.4
- Unity3D中关于场景销毁时事件调用顺序的一点记录
- ML、DL、CNN学习记录5
- php做APP接口开发,接口的安全性
- paip.python错误解决19
- Android 中关于属性动画的一些思考,或许能为你解决一定的性能问题
- 如何用xmlspy将xml文档生成xsd文件
- js实现椭圆轨迹_利用js实现div画椭圆曲线运动特效代码
- CS书籍、代码资源下载网址
- padavan手动安装php
- php 左右分栏,如何设置分栏格式
- 基于牛顿法的开平方实现
- windows10只显示图标不显示缩略图
- 动态背景线条,鼠标移动线条汇聚---背景特效