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相机功能实现 拍照并保存图片的更多相关文章

  1. Android Camera 相机程序编写

    Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...

  2. 【转】Android Camera 相机开发详解

    在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口.Camera2在接口和架构上做了巨大的变动, 但是基于众所周知的原因,我们还必须基于 Android ...

  3. Android 调用摄像头功能【拍照与视频】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...

  4. android Camera相机类

    Camera相机类相关的几个流程方法 Camera.open(cameraId) 打开相机 camera.setDisplayOrientation(0) 设置相机水平方向 mCamera.setPr ...

  5. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  6. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  7. Android Camera 拍照 三星BUG总结

    Android Camera 三星BUG  : 近期在Android项目中使用拍照功能 , 其他型号的手机执行成功了  只有在三星的相机上遇到了bug . BUG详细体现为 : (1) 摄像头拍照后图 ...

  8. Android开发 Camera2开发_1_拍照功能开发

    介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是 ...

  9. Android 学习笔记之如何实现简单相机功能

    PS:看来算法和数据结构还是非常有用的,以后每天都练习两道算法题目...这次忘了对代码进行折叠了..导致篇幅过长... 学习内容: 1.Android如何实现相机功能... 2.如何实现音频的录制.. ...

随机推荐

  1. AngularJS:template2

    ylbtech-AngularJS: 1.返回顶部 1.   2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1.   2.  6.返回顶部   作者:ylbtech出处:h ...

  2. nginx 配置隐藏index.php效果

    location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; } } 完整如下 server { li ...

  3. 根文件系统的构建与分析(三)之根文件目录及最简/dev目录

    根文件系统的构建与分析(三) 转载请注明 http://blog.csdn.net/jianchi88   Author:Lotte   邮箱:baihaowen08@126.com 一.FHS(Fi ...

  4. MFC调试的几个技巧

    TCHAR pStr[] = _T("this is a test!"); void* p = (void*)pStr; TRACE(_T("pStr is %s\n&q ...

  5. 讲解一下this (作用域)

    this的指向:普通函数内的this指向全局变量 构造函数内部this指向新创建出来的对象 对象方法内的this指向的是调用该方法的对象 call,apply,bind可以改变this的指向

  6. IDA Pro 权威指南学习笔记(七) - 其他 IDA 显示窗口

    默认情况下 IDA 不会打开这些窗口,可通过 View -> Open Subviews 命令打开 Strings 窗口(Strings) Strings 窗口中显示的是从二进制文件中提取出的一 ...

  7. python's twenty eithth day for me 模块和包

    模块: 什么是模块: 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀,但其实import加载的模块分为四个通用类别: 1,使用python编写的代码 ...

  8. DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen

    设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离 ...

  9. Python 面向对象的进阶

    类的成员 类的成员可以分为三大类 :  字段 , 方法 和  属性 注 :  所有的成员中,只有普通字段的内容保存对象中,  即 : 根据此类创建了对象,在内存就有多少个普通字段.  而其他的成员,则 ...

  10. 13-js的面向对象

    创建对象的几种常用的方式 1 . 使用Object或对象字面量创建对象 2 . 工厂模式创建对象 3 . 构造函数模式创建对象 4 . 原型模式创建对象 1 . 使用Object或对象字面量创建对象 ...