(原创)android中使用相机的两种方式
在社交类应用或扫描二维码的场合都需要用到手机上的摄像头
在程序中启用这一硬件主要有两类方法
1.发送intent启动系统自带的摄像应用
此应用的AndroidManifest中的intent-filter如下
<intent-filter>
<action android:name="android.media.action.VIDEO_CAPTURE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
发送intent的代码如下:
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
String path ="storage/sdcard1/picture1.jpg";
File pic =new File(path);
Uri uri= Uri.fromFile(pic);
//设定拍照后照片保存位置
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri );
startActivity(intent);
2.自己调用API,试用Camera对象来完成拍摄保存
代码如下:
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
surfaceView = (SurfaceView) findViewById(R.id.sv);
// 获得预览画面的接收类
SurfaceHolder holder = surfaceView.getHolder();
// 接收类设置callback -->surface创建的时候开启camera开始预览,退出时关闭
// 设置数据来源自渲染引擎, 不使用自己的缓冲区.
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
camera = Camera.open(); holder.addCallback(new Callback() { @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera.stopPreview(); // 停止摄像头预览
camera.release();
} @Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
// 摄像头的使用
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 设置预览显示
camera.startPreview();// 开始预览 } @Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
// TODO Auto-generated method stub }
});
} public void click(View v) {
shoot();
} public void shoot() { camera.takePicture(null, null, new PictureCallback() { @Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length); FileOutputStream fos = null;
try {
fos = new FileOutputStream("sdcard/pic1.jpg");
boolean isSuccess = bitmap.compress(CompressFormat.JPEG,
50, fos);
if (isSuccess) {
Toast.makeText(MainActivity.this, "拍摄和存储成功", 0).show();
} else {
Toast.makeText(MainActivity.this, "拍摄和存储失败", 0).show();
} } catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
});
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED); intent.setData(Uri.fromFile(new File("/sdcard")));
sendBroadcast(intent); camera.startPreview(); }
两种方法的对比
前一种方法需要跳出本程序,而且灵活性较低,但是简单易用,代码较少便于使用和维护.
后一种方法虽然比较复杂,但是可以自己定制拍摄activity的样式以及功能选项,并且在本应用中就可以完成拍摄的功能,用处也很多.
(原创)android中使用相机的两种方式的更多相关文章
- 转:在android中button响应的两种方式
1. 在布局文件中添加button的监听名字 Android:onClick="buttonOnClick" 例如: <Button android:id="@+i ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- jQuery中开发插件的两种方式
jQuery中开发插件的两种方式(附Demo) 做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数 ...
- web.config文件中配置数据库连接的两种方式
web.config文件中配置数据库连接的两种方式 标签: 数据库webconfig 2015-04-28 18:18 31590人阅读 评论(1)收藏举报 分类: 数据库(74) 在网站开发 ...
随机推荐
- HTTP Status Code [RFC]
来源:http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml Hypertext Transfer Prot ...
- VirtualBox5中安装的CentOS6.7安装增强工具
1.安装编译内核的相关组件 yum install kernel-devel gcc 2.安装VirtualBox增强功能 sh ./VBoxLinuxAdditions.run 3.重启系统 reb ...
- CentOS下nginx简单安装
说明:环境 系统:Centos 6 软件包:nginx-1.2.4 配置系统yum源 #/etc/yum.repos.d/ #rm -rf ./* vi localhost.repos.d [yumy ...
- C-基本语法与运算
编译: Technorati 标记: C 1, 编译compilers 命令make 将高级语言转换为低级语言. clang: 1,预处理(preprocessing) 2,编译(complition ...
- zabbix安装全过程
在了解<zabbix硬件.软件需求>之后,在你心里应该有备选的机器.今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置Linu ...
- Java中符号位扩展
第一个例子: byte b=-100;b在内存中是以补码的形式存贮的:1001 1100 如果执行char c=(char)b;如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位填充( ...
- 大数据架构师NoSQL建模技术
从数据建模的角度对NoSQL家族系统做了比较简单的比较,并简要介绍几种常见建模技术. 1.前言 为了适应大数据应用场景的要求,Hadoop以及NoSQL等与传统企业平台完全不同的新兴架构迅速地崛起.而 ...
- CF467D Fedor and Essay 建图DFS
Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...
- AjaxAnywhere+struts用法
AjaxAnywhere的用法 1,简介 AjaxAnywhere被设计成能够把任何一套现存的JSP组件转换成AJAX感知组件而不需要复杂的JavaScript编码.它利用标签把Web页面简单地划分成 ...
- R入门-第一次写了一个完整的时间序列分析代码
纪念一下,在心心念念想从会计本科转为数据分析师快两年后,近期终于迈出了使用R的第一步,在参考他人的例子前提下,成功写了几行代码.用成本的角度来说,省去了部门去买昂贵的数据分析软件的金钱和时间,而对自己 ...