(原创)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) 在网站开发 ...
随机推荐
- 解决Bootstrap模态框切换时页面抖动 or页面滚动条
Bootstrap为了让所有的页面(这里指内容溢出和不溢出)显示效果一样,采取的方法如下: 当Modal显示时,设置body -- overflow:hidden;margin-right:15px; ...
- easyUI 树的上下文菜单
一.属性:onContextMenu onContextMenu: function(e,node){ e.preventDefault(); $(this).tree('select',node.t ...
- Runner站立会议08
会议时间:2016.4.27 21.10~21.25 地点:基教负一层 今天:看日历的代码,网上下的,没有注释 明天:继续看代码 困难:代码看不懂 会议照片: 燃尽图:
- Stack类
栈是采用先进后出的数据存储方式,每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出. import java.util.Stack; //=============================== ...
- js获取某个ID的class名称
.HTML结构 <div id = "test" class="test_class">我的类名为test_class</div> &l ...
- setTimeout 导致的浏览器假死
问题 前几天,同事遇到一个浏览器假死的问题.就是浏览器在响应一个请求的时候,就突然不响应时间,进入假死状态,Cup也飙升到100%. 但是这个问题只出现在IE浏览器,chrome和Firefox等 ...
- PetaPoco 使用总结(二)
接着上一篇,上一篇主要介绍了PetaPoco 基本情况,优缺点和基本的查询功能,所以这篇主要介绍的是PetaPoco 的增,删,改等功能.PetaPoco提供了完整的增,删,改,查功能.是代替SqlH ...
- 无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站
我是WIN10+VS2015 之前用的是VS2012 后来卸载了VS2012 就出现了这个错误,请问该如何解决 在VS的图标上 按右键用管理员(Administrator)运行
- C#中事件的使用
C#中事件的使用 http://www.cnblogs.com/wayfarer/archive/2004/04/20/6712.html 用一个例子来说明事件的使用. 创建一个简单的类,名为Fil ...
- group
学习Linq时,经常会遇到Linq使用Group By问题,这里将介绍Linq使用Group By问题的解决方法. 1.计数 var q = from p in db.Products group p ...