zoukankan      html  css  js  c++  java
  • Android中调用摄像头并自动对焦拍照

    代码与范例:
    首先需要在Manifest文件中添加以下内容:

    以使程序获取摄像头使用以及自动对焦功能的使用权限。

    CameraTestActivity.java

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Window;
    import android.view.WindowManager;

    public class CameraTestActivity extends Activity {
    @Override
    public
    void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    // 设置横屏模式以及全屏模式
    setContentView(new CameraView(this)); //设置View
    }
    }

      CameraView.java

    import java.io.FileOutputStream;

    import android.content.Context;
    import android.hardware.Camera;
    import android.os.Environment;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;

    public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback {
    private SurfaceHolder holder;
    private Camera camera;
    private
    boolean af;

    public CameraView(Context context) {
    //构造函数
    super(context);

    holder
    = getHolder();//生成Surface Holder
    holder.addCallback(this);

    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    //指定Push Buffer
    }

    public
    void surfaceCreated(SurfaceHolder holder) {//Surface生成事件的处理
    try {
    camera
    = Camera.open();//摄像头的初始化
    camera.setPreviewDisplay(holder);
    }
    catch (Exception e) {
    }
    }

    @Override
    public
    void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//Surface改变事件的处理
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(width, height);
    camera.setParameters(parameters);
    //设置参数
    camera.startPreview();//开始预览
    }

    public
    void surfaceDestroyed(SurfaceHolder holder) {//Surface销毁时的处理
    camera.setPreviewCallback(null);
    camera.stopPreview();
    camera.release();
    camera
    =null;
    }

    @Override
    public
    boolean onTouchEvent(MotionEvent event) {//屏幕触摸事件
    if (event.getAction() == MotionEvent.ACTION_DOWN) {//按下时自动对焦
    camera.autoFocus(null);
    af
    =true;
    }
    if (event.getAction() == MotionEvent.ACTION_UP && af ==true) {//放开后拍照
    camera.takePicture(null, null, this);
    af
    =false;
    }
    returntrue;
    }

    public
    void onPictureTaken(byte[] data, Camera camera) {//拍摄完成后保存照片
    try {
    String path
    = Environment.getExternalStorageDirectory() +"/test.jpg";
    data2file(data, path);
    }
    catch (Exception e) {
    }
    camera.startPreview();
    }

    private
    void data2file(byte[] w, String fileName) throws Exception {//将二进制数据转换为文件的函数
    FileOutputStream out =null;
    try {
    out
    =new FileOutputStream(fileName);
    out.write(w);
    out.close();
    }
    catch (Exception e) {
    if (out !=null)
    out.close();
    throw e;
    }
    }

    }

      说明:这是一个简单的示例程序。功能是使用自动对焦功能拍摄一张照片保存于SD卡根目录下。需要注意的是要在manifest文件中声明相关的许可。本例中许多参数都没有设置,可以根据具体需要进行适当的修改以满足特定要求。

     

  • 相关阅读:
    Mysql 重置密码
    windows下如何安装和启动MySQL
    连接到 PostgreSQL 数据源(SQL Server 导入和导出向导)
    通过apt-get安装JDK8
    Windows 更快捷方便的安装软件,命令提示符上安装 Chocolatey
    Windows 的命令行安装Scoop程序管理工具
    CentOS 7更改yum源与更新系统
    Mysql 获取表设计查询语句
    坐标3度带与6度带的知识(转载)
    jQuery学习---第三天
  • 原文地址:https://www.cnblogs.com/gzggyy/p/2123920.html
Copyright © 2011-2022 走看看