欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发实现拍照功能的方法实例解析

程序员文章站 2023-12-05 15:25:46
本文实例讲述了android开发实现拍照功能的方法。分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkcamerahardware(this)...

本文实例讲述了android开发实现拍照功能的方法。分享给大家供大家参考,具体如下:

解析:

1)判断是否有摄像头checkcamerahardware(this)
2)获得相机camera = camera.open(0);
3)把相机添加到mpreview = new surfacepreview(this, mcamera);
4)实现拍照 mcamera.autofocus
5)在拍照后使用mcamera.takepicture(null, null, mpicture);方法把图片保存到sdcard

代码实现:

/**
 * 使用照相机拍照
 * @author chen.lin
 *
 */
public class cameraactivity extends activity {
  private camera mcamera;//相机
  private surfacepreview mpreview;//视图
  private framelayout mframelayout;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_camera_takephoto);
    mframelayout = (framelayout) findviewbyid(r.id.framelayout);
    if (checkcamerahardware(this)) {
      mcamera = getcamera();
      mpreview = new surfacepreview(this, mcamera);
      mframelayout.addview(mpreview);
    }
  }
  /**
   * 拍照对焦
   * @param view
   */
  public void takephoto(view view){
    mcamera.autofocus(new autofocuscallback() {
      @override
      public void onautofocus(boolean success, camera camera) {
        mcamera.takepicture(null, null, mpicture);
      }
    });
  }
  /**
   * 拍照后的图片保存
   */
  private picturecallback mpicture = new picturecallback() {
    @override
    public void onpicturetaken(byte[] data, camera camera) {
      try {
        file file = new file("/sdcard/file/aa.jpg");
        if (!file.exists()) {
          file.mkdirs();
        }
        fileoutputstream fos = new fileoutputstream(file);
        fos.write(data);
        fos.close();
      } catch (filenotfoundexception e) {
        e.printstacktrace();
      } catch (ioexception e) {
        e.printstacktrace();
      }
    }
  };
  /**
   * 判断照相机是否存在
   * @param context
   * @return
   */
  private boolean checkcamerahardware(context context){
    if (context.getpackagemanager().hassystemfeature(packagemanager.feature_camera)) {
      return true;
    }
    return false; 
  }
  /**
   * 初始化照相机
   * @return
   */
  public static camera getcamera(){
    camera camera = null;
    try {
      camera = camera.open(0);
    } catch (exception e) {
      e.printstacktrace();
    }
    return camera;
  }
  /**
   * 实现拍照视图
   */
  @suppresswarnings("deprecation")
  private class surfacepreview extends surfaceview implements surfaceholder.callback{
    private camera mcamera;
    private surfaceholder mholder;
    public surfacepreview(context context, camera camera) {
      super(context);
      mcamera = camera;
      mholder = getholder();
      mholder.addcallback(this);
      mholder.settype(surfaceholder.surface_type_push_buffers);
    }
    @override
    public void surfacecreated(surfaceholder holder) {
      try {
        mcamera.setpreviewdisplay(mholder);
        mcamera.startpreview();
      } catch (ioexception e) {
        e.printstacktrace();
      }
    }
    @override
    public void surfacechanged(surfaceholder holder, int format, int width, int height) {
      if (holder.getsurface() == null) {
        return;
      }
      try {
        mcamera.stoppreview();
        mcamera.setpreviewdisplay(mholder);
        mcamera.startpreview();
      } catch (ioexception e) {
        e.printstacktrace();
      }
    }
    @override
    public void surfacedestroyed(surfaceholder holder) {
      //
      mcamera = null;
    }
  }
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <framelayout
    android:id="@+id/framelayout"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" >
  </framelayout>
  <button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onclick="takephoto"
    android:text="拍照" />
</linearlayout>

更多关于android相关内容感兴趣的读者可查看本站专题:《android拍照与图片处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。