(原创)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) 在网站开发 ...
随机推荐
- C#------对SQLServer进行简单的增,删,改,查
EF中的操作转载: http://www.cnblogs.com/mcgrady/archive/2015/03/21/4355282.html PSContext db = new PSContex ...
- spark 读取 elasticsearch数据
–master spark://10.8.2.100:7077 –jars /usr/local/spark-1.5.2/lib/elasticsearch-hadoop-2.1.1.jar
- Eclipse中修改Web项目的URL访问路径
背景 访问路径,也就是指在浏览器中访问该web系统时的根路径,比如http://localhost:8080/xxxx/index.jsp 这里的xxxx,也就是request.getContext ...
- Cache-Aside Pattern解析
使用这种模式,可以帮助我们维护Cache中的数据. 使用Cache容易遇到的问题: 使用缓存,主要是为了将一些重复访问的数据存到缓存,开发者希望缓存中的数据和数据源中的保持一致,这就需要程序中有相应的 ...
- OSX10.11 删除系统自带的软件
之前一直用sudo rm - rf 系统的浏览器名字 正常删除safari 升级到10.11后,完全没作用了 需要关闭系统的什么安全模式 csrutil disable 再进入系统使用此命令可正常删除 ...
- 第一次使用Android Studio时你应该知道的一切配置
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- JAVA GUI随笔
Java的布局管理器提供了一种层面的抽象,自动将用户界面映射到所有的窗口系统.GUI组件放置在容器中,它们的位置由容器的布局管理器来管理. 布局管理器是使用布局管理器类创建的. 注:同一个对象无论添加 ...
- Django笔记-字符编码相关问题整理
1.添加中文注释后编译出错,提示:Non-ASCII 解决方法: 在Python脚本文件的第一行或第二行添加一句: #coding:gbk或#coding:utf-8或##-*- cod ...
- coreos安装
cloud-config-bootstrap.sh #!/bin/bash cat > "cloud-config.yaml" <<EOF #cloud-conf ...
- php对uploads文件的处理问题的解决
解决uploads问题的要点有几点: 参考这篇文章 第一, 在php.ini文件中, 有file_uploads这一节 file_uploads = On ;是否开启文件上传功能, 该功能有很大的安全 ...