利用Camera与Surface结合的一个自动对焦拍照Demo
来源:互联网 发布:windows摄像头驱动 编辑:程序博客网 时间:2024/04/28 08:29
附上配置文件权限:
<!--使用摄像头权限 --> <uses-permission android:name="android.permission.CAMERA"/> <!--设置SD卡写入权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--声明使用Camera意图 --> <uses-feature android:name="android.hardware.camera"/> <!--声明调用Camera自动对焦功能 --> <uses-feature android:name="android.hardware.camera.autofocus"/>
package com.mao.maodemo;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import com.mao.maodemo.base.ActivityBase;import android.app.AlertDialog;import android.content.DialogInterface;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.graphics.ImageFormat;import android.graphics.Point;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.PictureCallback;import android.hardware.Camera.ShutterCallback;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;/** * * 测试Camera 拍照以及预览功能 * 当为预览状态时直接打开Camera显示预览画面 * 用户点击拍照保存,生成文件 * * @author Ming * @date 2014 下午1:59:02 */public class ActivityCameraTest extends ActivityBase implements OnClickListener{public static final String TAG="ActivityCameraTest";private SurfaceView mSurfaceView;private SurfaceHolder mHolder;private Camera mCamera;private Button mButton_take;private Button mButton_cancle;private WindowManager mWindowManager;private Point mPoint;private boolean isPreview; //是否为预览状态@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera_test);mWindowManager=getWindowManager();mPoint=new Point();mWindowManager.getDefaultDisplay().getSize(mPoint);init();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_camera_test, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}private void init(){mSurfaceView=(SurfaceView) findViewById(R.id.main_surfaceview);mButton_take=(Button) findViewById(R.id.take_photo);mButton_cancle=(Button) findViewById(R.id.cancle_photo);//设置改SurfaceView 不需要自己维护缓冲区 此方法以及过时if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}mButton_take.setOnClickListener(this);mHolder=mSurfaceView.getHolder();mHolder.addCallback(new Callback() {@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if(null!=mCamera){mCamera.stopPreview();}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {//打开摄像头initCamera();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}});}@Overridepublic void onClick(View v) {if(mButton_take.getId()==v.getId()){takePhoto();}else if(mButton_cancle.getId()==v.getId()){}}private void initCamera(){if(!isPreview){//控制打开摄像头文件//设置参数为0时表示打开后置摄像头//默认直接Open时表示的是打开后置摄像头 也可直接设置为1 打开前置摄像头 //*************需要注意一点是在一般手机上不支持前置摄像头自动对焦功能。*************mCamera=Camera.open(1);//设置显示的角度mCamera.setDisplayOrientation(90);}if(null!=mCamera&&!isPreview){Camera.Parameters mParameters=mCamera.getParameters();mParameters.setPreviewSize(mPoint.x,mPoint.y);mParameters.setPictureSize(mPoint.x,mPoint.y);//设置帧数浮动值mParameters.setPreviewFpsRange(4, 10);//设置预览的图片格式mParameters.setPreviewFormat(ImageFormat.JPEG);mParameters.set("jpeg-quality", 85);try {mCamera.setPreviewDisplay(mHolder);mCamera.startPreview();} catch (IOException e) {e.printStackTrace();}//判断是否预览isPreview=true;}}private void takePhoto(){if(null!=mCamera){mCamera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {//当对角成功时进行拍照if(success){mCamera.takePicture(new ShutterCallback() {@Overridepublic void onShutter() {//用户按下快门时激发此操作Toast.makeText(getApplicationContext(), "按下快门啦~", Toast.LENGTH_SHORT).show();}}, new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//相机获取到原始照片时激发该监听器Toast.makeText(getApplicationContext(), "获取到原始照片", Toast.LENGTH_SHORT).show();}}, new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//相机获取到jpg照片时激发该操作//获取到拍摄完成的照片View mView=getLayoutInflater().inflate(R.layout.preview_image, null);final Bitmap mBitmap=BitmapFactory.decodeByteArray(data, 0, data.length);ImageView mImageView=(ImageView) mView.findViewById(R.id.preview_image);mImageView.setImageBitmap(mBitmap);new AlertDialog.Builder(ActivityCameraTest.this).setView(mView).setPositiveButton("保存", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//对文件进行保存,判断Sd卡是不是已经挂载if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File mFile=new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");if(!mFile.exists()&&!mFile.isFile()){Log.e(TAG, "ERROR STATE");mFile.mkdirs();}FileOutputStream mOutputStream=null;try {mOutputStream=new FileOutputStream(mFile);mBitmap.compress(CompressFormat.JPEG, 100, mOutputStream);mOutputStream.flush();mOutputStream.close();} catch (FileNotFoundException e) {Log.e(TAG, "ERROR-------文件流出错");e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{showToast(getApplicationContext(), "Sd卡不可用,请检查后重试!");}}}).setNegativeButton("取消", null).show();//重新浏览mCamera.stopPreview();mCamera.startPreview();isPreview=true;}});}}});}}@Overrideprotected void onDestroy() {if(null!=mCamera){mCamera.release();mCamera=null;}super.onDestroy();}}
本Demo主要功能为实现自动对焦功能,结合SurfaceView预览画面。
0 0
- 利用Camera与Surface结合的一个自动对焦拍照Demo
- Camera自动对焦
- android实现自动对焦拍照
- 转老戴自动对焦camera view
- 【Android】设置摄像头方向、打开线程与预览线程、设置参数、Camera外设按键、自动对焦与触摸对焦、拍照、人脸检测、位置管理、旋转管理、变焦、录像
- android camera 根据加速器的变化实现自动对焦
- Android 系统中camera中 自动对焦的解决方案
- [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
- 摄像头的自动对焦
- 自动对焦的原理
- android Camera摄像头-Surface view 预览拍照 并将拍的照片插入到系统图库
- 对焦过程不拍照的实现---mtk
- MTK 实现CAMERA 自动拍照的功能代码
- Android进阶——多线程间的通信之调用系统标准摄像头自动对焦并自动完成隐蔽拍照
- 自动对焦拍照,以及可移动方框定位
- 使用GLSurfaceView预览Camera 基础拍照demo
- 推荐一个JAVA的拍照Camera Capture调用包
- Android NDK——TextureView的应用之调用外接USB摄像头自动对焦并完成隐蔽拍照
- 创建带倒影的图像和渐变的图像
- 求教spring security remember me
- 第17周 项目3 体重状况
- 枚举法 背包问题01
- Pki原理
- 利用Camera与Surface结合的一个自动对焦拍照Demo
- C++ string中的几个小陷阱,你掉进过吗?
- 如何制作索尼机型用的主题文件(4.1和4.3&4.4)
- 继承和派生
- 基于 OSGi 和 Spring 开发 Web 应用
- JavaScript:js常用工具笔记
- XMPP iOS客户端开发(二) 通信
- view的tag值相关
- jQueryEasyUI ValidateBox 验证框轻松实现验证功能