AndroidCamera开发学习笔记01
概述
- Android框架支持设备的
相机拍照和录像功能- 可以直接调用系统的Camera应用来拍照或录像
- 也可以利用Adroid系统提供的API开发Camera应用来实现拍照和录像的功能
注意事项
- 需要硬件支持
- 建议优先使用系统相机应用,也可以自己开发一个相机应用
- 拍摄的照片和视频是否对其他应用可见
- 应用被卸载以后,是否保留拍摄的照片和视频文件
基础知识
- Camera:提供基础API使用设备的相机,并为应用提供拍照和录像的API
- SurfaceView:用于显示相机的预览数据
- MediaRecord:提供录像相关的API
- Intent:
- 使用MediaStore.ACTION_IMAGE_CAPTURE进行快速拍照
- 使用MediaStore.ACTION_VIDEO_CAPTURE进行快速录像。
权限声明
Camera Permession
- 在开发相机应用前,需要在Manifest中申请如下权限才可以使用相机
- 如果使用Intent发送快速拍照请求,则无需申请该权限
Storage Permession
- 如果应用保存保持照片或视频到设备存储中,需要指定文件的写权限
Audio Recording Permession
- 必须申请录音权限才能使用相机进行录像
Location Permession
- 如果应用需要拍摄的照片记录地理位置,需要申请定位权限
使用已存在的相机应用拍摄
- 在应用中可以通过发送一个Intent到系统相机应用来实现一个快速拍照或录像的功能
- 创建Intent请求用来拍照或录像,有关的Intent类型如下:
- MediaStore.ACTION_IMAGE_CAPTURE - 该Intent action 类型用于请求系统相机拍照。
- MediaStore.ACTION_VIDEO_CAPTURE - 该Intent action 类型用于请求系统相机录像。
- 调用Activity的startActivityForResult()方法来发送Camera Intent请求拍照或者录像,当发送Intent以后,当前应用会跳转到系统相机app界面,让用户进行拍照或录像
- 在Activity中实现onActivityResult()方法来接收系统相机的拍摄结果,该方法在用户完成拍照或者录像以后由系统调用
- 创建Intent请求用来拍照或录像,有关的Intent类型如下:
使用Intent拍照
- 发送Intent拍照携带的外部数据的信息如下:
- MediaStore.EXTRA_OUTPUT
- 这个关键字用于创建一个Uri对象来指定一个路径和文件名保存照片。当然,这个设置是可选的,不过强烈推荐使用该方法来保存照片。如果你没有在指定该关键字的值,系统的camera应用会将照片以默认的名字保存在一个默认的地方,当你指定了该关键字的值,数据以Intent.getData()方法返回Uri对象。
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
当调用startActivityForResult() 方法以后,用户可以看到系统相机的拍照界面。在用户拍照结束以后(或者取消拍照),系统相机会把照片数据返回给你的应用,当然你必须在自己的应用中实现onActivityResult()方法来接收照片数据。
使用Intent录像
- 发送Intent录像携带的外部数据extra的信息如下:
- MediaStore.EXTRA_OUTPUT
- 该关键字和拍照使用的关键字一样,意思就是制定一个路径和文件名来构建一个U日对象来保存录像结果,同样录像结果会以Intent.getData()的方法返回Uri对象。
- MediaStore.EXTRA_VIDEO_QUALITY
- 该关键字用于指定拍摄的录像质量,参数0表示低质量,参数1表示高质量。
- MediaStore.EXTRA_DURATION_LIMIT
- 该关键之用于指定拍摄的录像的时间限制,单位是秒。
- MediaStore.EXTRA_SIZE_LIMIT
- 该关键字用于指定拍摄的录像文件大小限制,单位值byte。
- MediaStore.EXTRA_OUTPUT
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
当调用startActivityForResult() 方法以后,用户可以看到系统相机的拍照界面。在用户录像结束以后(或者取消录像),系统相机会把视频数据返回给你的应用,当然你必须在自己的应用中实现onActivityResult()方法来接收视频数据。更多有关如何在自己的应用接收拍照结果的信息请参考接收相机返回的数据。
接收相机返回的数据
- 为了接收Intent的结果数据,你必须重写activity的onActivityResult()方法。接下来的代码将演示如何实现onActiviytResult()方法来接收照片或者视频数据。
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
}
一旦你的activity成功接收返回结果,相机拍摄的照片或者视频是一个指向你应用可以访问的路径。也就是getOutputMediaFileUri()方法返回的Uri文件地址。
AndroidCamera开发学习笔记01的更多相关文章
- C++ GUI Qt4学习笔记01
C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...
- 【前端】移动端Web开发学习笔记【2】 & flex布局
上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
- 高性能Cordova App开发学习笔记
高性能Cordova App开发学习笔记 文件结构 添加插件 构建准备 各个www的作用,prepare命令会将hello\www的内容会拷贝到platform下的wwww目录,知道该改哪里了吧?如果 ...
- Rest API 开发 学习笔记(转)
Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...
- 步步为营 SharePoint 开发学习笔记系列总结
转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...
随机推荐
- 在linux下执行git clone、git pull 、git push等操作免密
1. 通过ssh密钥实现 ssh-keygen -t rsa -C "你的邮箱" -f "自己定义的目录" 打开: id_rsa.pub ,将文件内容复制到 g ...
- Tomcat在IDEA部署Web项目
Tomcat在IDEA上部署Web项目: 一.新建Maven-Web项目: 1.新建项目,选择Maven,从模板中创建,选中web-app 2.选择项目地址: 3.选择配置的maven(如果按我之前写 ...
- Appium自动化(9) - appium元素定位的快速入门
如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 快速入门栗子:boss直聘 app ...
- codis原理及部署_01
一.codis介绍 Codis是一个分布式Redis解决方案,对于上层的应用来说,连接到Codis Proxy和连接原生的RedisServer没有明显的区别,有部分命令不支持 Codis底层会处理请 ...
- UIStackView上手教程
https://www.jianshu.com/p/19fbf3ee2840 https://www.cnblogs.com/bokeyuanlibin/p/5693575.html https:// ...
- CentOS7初始化服务器开发环境——根据个人习惯而定
目录 修改hostname 创建个人账户和组 修改hostname 编辑主机名称,注意:执行以下指令,无需重启服务器,因为此指令实时写入linux 内核 hostnamectl --static se ...
- [Axure教程]0005.系统函数与变量介绍
1.变量的种类: [1].全局变量:可以在整个原型的任意位置调用和修改. [2].局部变量:仅作用于某一事件的某一动作内. [3].自定义变量:自行新建的全局变量. 2.Axure函数: [1].特殊 ...
- eatwhatApp开发实战(二)
上期,我们做了个小app“eatwhat”,接下来每期都会为其添加新的功能.本期,我们为店铺增加添加店铺的功能. 还是先设置个布局: <RelativeLayout android:layout ...
- Linux 比较常用的命令
#磁盘空间 df -h 显示已经挂载的分区列表 du -sh [file] 估算当前使用磁盘空间 du -sk * | sort -rn 以容量大小递减排序 文件搜索 find find [file_ ...
- 从汉堡加料说起——浅谈C#中的Decorator模式
相信大家都在都在汉堡店吃过汉堡,有些汉堡店很有特色,推出了汉堡订制服务,即,可以在汉堡中加料,加肉饼,加生菜之类(有点类似我们本地的肥肠粉里面加冒结子).更是让不少吃货大快朵颐,大呼过瘾,加6,7层肉 ...