Android Camera相机功能实现 拍照并保存图片
AndroidManifest.xml
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <Button
android:id="@+id/btn_camera"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Camera" /> <SurfaceView
android:id="@+id/mySurfaceView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
private Button btnCamera=null;
private SurfaceView mySurfaceView =null;
private Camera cam=null;
private SurfaceHolder holder=null;
private boolean previewRunning=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.btnCamera=(Button)super.findViewById(R.id.btn_camera);
this.mySurfaceView=(SurfaceView)super.findViewById(R.id.mySurfaceView);
this.btnCamera.setOnClickListener(new OnClickListenerImpl());
this.holder=this.mySurfaceView.getHolder();
this.holder.addCallback(new MySurfaceViewCallback());
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
this.holder.setFixedSize(800, 480);
}
private class OnClickListenerImpl implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(MainActivity.this.cam!=null){
MainActivity.this.cam.autoFocus(new AutoFocusCallbackImpl());
}
}
}
private class MySurfaceViewCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
MainActivity.this.cam=Camera.open(); //取第一个摄像头
WindowManager manager=(WindowManager)MainActivity.this.getSystemService(Context.WINDOW_SERVICE);
Display display=manager.getDefaultDisplay();
Parameters param=MainActivity.this.cam.getParameters();
param.setPreviewSize(display.getWidth(), display.getHeight());
param.setPreviewFrameRate(5);//一秒5帧
param.setPictureFormat(PixelFormat.JPEG);
param.set("jpeg-quality", 80);
MainActivity.this.cam.setParameters(param);
try {
MainActivity.this.cam.setPreviewDisplay(MainActivity.this.holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MainActivity.this.cam.startPreview();//预览
MainActivity.this.previewRunning=true;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(MainActivity.this.cam!=null){
if(MainActivity.this.previewRunning){
MainActivity.this.cam.stopPreview();
MainActivity.this.previewRunning=false;
}
MainActivity.this.cam.release();//释放摄像头
}
}
}
private class AutoFocusCallbackImpl implements AutoFocusCallback{
@Override
public void onAutoFocus(boolean success, Camera camera) {
// 对焦操作
if(success){
MainActivity.this.cam.takePicture(sc, pc, jpegcall);
}
}
}
private PictureCallback jpegcall=new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 保存图片操作
Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
String fileName=Environment.getExternalStorageDirectory().toString()
+File.separator
+"AppTest"
+File.separator
+"PicTest_"+System.currentTimeMillis()+".jpg";
File file=new File(fileName);
if(!file.getParentFile().exists()){
file.getParentFile().mkdir();//创建文件夹
}
try {
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(file));
bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos);//向缓冲区压缩图片
bos.flush();
bos.close();
Toast.makeText(MainActivity.this, "拍照成功,照片保存在"+fileName+"文件之中!", Toast.LENGTH_LONG).show();
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
Toast.makeText(MainActivity.this, "拍照失败!"+e.toString(), Toast.LENGTH_LONG).show();
}
MainActivity.this.cam.stopPreview();
MainActivity.this.cam.startPreview();
}
};
private ShutterCallback sc=new ShutterCallback() {
@Override
public void onShutter() {
// 按下快门之后进行的操作
}
};
private PictureCallback pc=new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
}
};
Android Camera相机功能实现 拍照并保存图片的更多相关文章
- Android Camera 相机程序编写
Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...
- 【转】Android Camera 相机开发详解
在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...
- Android 调用摄像头功能【拍照与视频】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...
- android Camera相机类
Camera相机类相关的几个流程方法 Camera.open(cameraId) 打开相机 camera.setDisplayOrientation(0) 设置相机水平方向 mCamera.setPr ...
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Android Camera 拍照 三星BUG总结
Android Camera 三星BUG : 近期在Android项目中使用拍照功能 , 其他型号的手机执行成功了 只有在三星的相机上遇到了bug . BUG详细体现为 : (1) 摄像头拍照后图 ...
- Android开发 Camera2开发_1_拍照功能开发
介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是 ...
- Android 学习笔记之如何实现简单相机功能
PS:看来算法和数据结构还是非常有用的,以后每天都练习两道算法题目...这次忘了对代码进行折叠了..导致篇幅过长... 学习内容: 1.Android如何实现相机功能... 2.如何实现音频的录制.. ...
随机推荐
- Vue.js:路由
ylbtech-Vue.js:路由 1.返回顶部 1. Vue.js 路由 本章节我们将为大家介绍 Vue.js 路由. Vue.js 路由允许我们通过不同的 URL 访问不同的内容. 通过 Vue. ...
- tomcat启动时的java_home和jre_home错误
The JRE_HOME environment variable is not defined correctlyThis environment variable is needed to run ...
- C++对Lua中table进行读取、修改和创建
C++代码: // LuaAndC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #i ...
- dubbo学习 一 dubbo概述
1,背景 1,网站刚开时候的时候可能所有的功能业务都在一个应用里面 2,当业务不断复杂,流量不断增多的时候,就需要将原先的一个应用划分成多个独立的应用. 3,当分出来的业务越来越多的时候,应用 ...
- 最长回文子串(Mirrored String II)
Note: this is a harder version of Mirrored string I. The gorillas have recently discovered that the ...
- Hadoop IO 特性详解(1)
本文结合hadoop : the definitive guide精心而作,包含作者的心血,希望可以帮助大家理解一点hdfs的皮毛,足矣.(charles@xingbod.cn) hadoop本身自带 ...
- [JBPM3.2]TaskNode的signal属性详解
TaskNode节点的signal属性决定了任务完成时对流程执行继续的影响,共有六种取值:unsynchronized,never,first,first-wait,last,last-wait.默认 ...
- Spark的几个问题
1.application是由driver和executor组成的,executor可以分成task,task又可以分成为stage.当一个任务提交给spark之后,spark机群的主节点会出现dri ...
- OSCache-JSP页面缓存(2)
如果在jsp中使用如下标签 <cache:cache key="foobar" scope="session"> some jsp content ...
- tmux颜色高亮跟vim不一致的情况
安装完tmux之后,按照网上大神的配置,稍微配置了下~/.tmux.conf: # 改变快捷键前缀 unbind C-b set -g prefix C-a # 绑定配置加载按键 bind r sou ...