全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

android自定义Camera拍照并查看图片

本文实例为大家分享了android自定义Camera拍照并查看图片的具体代码,供大家参考,具体内容如下

1、打开相机

a.预览拍摄图片,需用到SurfaceView,并且实现其回调函数implements SurfaceHolder.Callback;
activity_camera.xml

<?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" >

  <SurfaceView
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

  <Button
    android:id="@+id/btn_camera"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="拍照" />

</LinearLayout>

2、获取相机并开启预览

/**
   * 获取系统相机
   * 
   * @return
   */
  private Camera getcCamera() {
    Camera camera = null;
    try {
      camera = Camera.open();
    } catch (Exception e) {
      camera = null;
    }
    return camera;
  }

/**
   * 显示相机预览图片
   * 
   * @return
   */
  private void showCameraView(Camera camera,SurfaceHolder holder)
  {
    try {
      camera.setPreviewDisplay(holder);
      camera.setDisplayOrientation(90);
      camera.startPreview();
    }catch (Exception e){
      e.printStackTrace();
    };

  }
/**
** 实现界面回调处理
*/
  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    showCameraView(mCamera, holder);
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    mCamera.stopPreview();
    showCameraView(mCamera, holder);
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    clearCamera();
  }
}

3、相机主页面处理

public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{

  private SurfaceView sv;
  private Camera mCamera;
  private SurfaceHolder holder;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);
    sv = (SurfaceView)findViewById(R.id.sv);
    holder = sv.getHolder();
    holder.addCallback(this);

    findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        // 获取当前相机参数
        Camera.Parameters parameters = mCamera.getParameters();
        // 设置相片格式
        parameters.setPictureFormat(ImageFormat.JPEG);
        // 设置预览大小
        parameters.setPreviewSize(800, 480);
        // 设置对焦方式,这里设置自动对焦
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        mCamera.autoFocus(new Camera.AutoFocusCallback() {

          @Override
          public void onAutoFocus(boolean success, Camera camera) {
            // 判断是否对焦成功
            if (success) {
              // 拍照 第三个参数为拍照回调
              mCamera.takePicture(null, null, new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                  // data为完整数据
                  File file = new File("/sdcard/photo.png");
                  // 使用流进行读写
                  try {
                    FileOutputStream fos = new FileOutputStream(file);
                    try {
                      fos.write(data);
                      // 关闭流
                      fos.close();
                      // 查看图片
                      Intent intent = new Intent();
                      // 传递路径
                      intent.putExtra("path", file.getAbsolutePath());
                      setResult(0,intent);
                      finish();
                    } catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                    }
                  } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                  }
                }
              });
            }
          }
        });
      }
    });

  }

 @Override
  protected void onResume() {
    super.onResume();
    if (mCamera == null) {
      mCamera = getCamera();
      if (holder != null) {
        showCameraView(mCamera, holder);
      }
    }
  }
  @Override
  protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    // activity暂停时我们释放相机内存
    clearCamera();

  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
  }

  /**
   * 释放相机的内存
   */
  private void clearCamera() {

    // 释放hold资源
    if (mCamera != null) {
      // 停止预览
      mCamera.stopPreview();
      mCamera.setPreviewCallback(null);
      // 释放相机资源
      mCamera.release();
      mCamera = null;
    }
  }

4、启动activity(设置拍照完图片路径返回显示图片处理,一定要对图片进行采样率操作(很可能拍照的图片太多而无法显示,又不报任何异常))

public class MainActivity extends AppCompatActivity {

  private ImageView cameraIv;

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == 0 && requestCode == 100)
    {
      String path = data.getStringExtra("path");
      BitmapFactory.Options options = new BitmapFactory.Options();
      options.inJustDecodeBounds = true;
      BitmapFactory.decodeFile(path, options);
      ImageSize imageSize = getImageViewSize(cameraIv);
      options.inSampleSize = caculateInSampleSize(options,
          imageSize.width, imageSize.height);

      // 使用获得到的InSampleSize再次解析图片
      options.inJustDecodeBounds = false;
      Bitmap bitmap = BitmapFactory.decodeFile(path, options);
      cameraIv.setImageBitmap(bitmap);
    }

    super.onActivityResult(requestCode, resultCode, data);
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button openButton = (Button) findViewById(R.id.button);
    cameraIv = (ImageView) findViewById(R.id.imageView);



    openButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this,CameraActivity.class);
        startActivityForResult(intent,100);
      }
    });
  }

   /* 根据需求的宽和高以及图片实际的宽和高计算SampleSize
   *
       * @param options
   * @param width
   * @param height
   * @return
       */
  public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth,
                      int reqHeight)
  {
    int width = options.outWidth;
    int height = options.outHeight;

    int inSampleSize = 1;

    if (width > reqWidth || height > reqHeight)
    {
      int widthRadio = Math.round(width * 1.0f / reqWidth);
      int heightRadio = Math.round(height * 1.0f / reqHeight);

      inSampleSize = Math.max(widthRadio, heightRadio);
    }

    return inSampleSize;
  }

  public static ImageSize getImageViewSize(ImageView imageView)
  {

    ImageSize imageSize = new ImageSize();
    DisplayMetrics displayMetrics = imageView.getContext().getResources()
        .getDisplayMetrics();

    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)imageView.getLayoutParams();

    int width = imageView.getWidth();// 获取imageview的实际宽度
    if (width <= 0)
    {
      width = lp.width;// 获取imageview在layout中声明的宽度
    }

    if (width <= 0)
    {
      width = displayMetrics.widthPixels;
    }

    int height = imageView.getHeight();// 获取imageview的实际高度
    if (height <= 0)
    {
      height = lp.height;// 获取imageview在layout中声明的宽度
    }

    if (height <= 0)
    {
      height = displayMetrics.heightPixels;
    }
    imageSize.width = width;
    imageSize.height = height;

    return imageSize;
  }

  public static class ImageSize
  {
    int width;
    int height;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android  # Camera  # 拍照  # android自定义Camera实现录像和拍照  # Android自定义Camera实现拍照功能  # Android实现Camera2预览和拍照效果  # Android Camera实现毫秒级拍照实例  # Android中使用Camera类编写手机拍照App的实例教程  # android系统在静音模式下关闭camera拍照声音的方法  # Android实现拍照、选择图片并裁剪图片功能  # Android启动相机拍照并返回图片  # Android拍照保存在系统相册不显示的问题解决方法  # Android自定义Camera实现拍照小功能  # 对焦  # 回调  # 流进  # 很可能  # 自定义  # 又不  # 第三个  # 大家分享  # 具体内容  # 大家多多  # 设置自动  # 需用  # 判断是否  # 多而  # 图片处理  # 采样率  # surfaceChanged  # mCamera  # Override  # public 


相关文章: 如何快速搭建FTP站点实现文件共享?  MySQL查询结果复制到新表的方法(更新、插入)  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何解决VPS建站LNMP环境配置常见问题?  购物网站制作公司有哪些,哪个购物网站比较好?  建站主机与虚拟主机有何区别?如何选择最优方案?  设计网站制作公司有哪些,制作网页教程?  建站之星后台密码遗忘如何找回?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何快速搭建支持数据库操作的智能建站平台?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  javascript中对象的定义、使用以及对象和原型链操作小结  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  建站之星安装提示数据库无法连接如何解决?  盘锦网站制作公司,盘锦大洼有多少5G网站?  ,巨量百应是干嘛的?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何高效完成独享虚拟主机建站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  营销式网站制作方案,销售哪个网站招聘效果最好?  如何用已有域名快速搭建网站?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  建站之星如何优化SEO以实现高效排名?  想学网站制作怎么学,建立一个网站要花费多少?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  ,南京靠谱的征婚网站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  网站制作话术技巧,网站推广做的好怎么话术?  如何在七牛云存储上搭建网站并设置自定义域名?  如何通过虚拟主机快速完成网站搭建?  制作网页的网站有哪些,电脑上怎么做网页?  如何在云主机快速搭建网站站点?  Android自定义listview布局实现上拉加载下拉刷新功能  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  油猴 教程,油猴搜脚本为什么会网页无法显示?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  如何零基础在云服务器搭建WordPress站点?  如何快速搭建响应式可视化网站?  完全自定义免费建站平台:主题模板在线生成一站式服务  如何在Golang中指定模块版本_使用go.mod控制版本号  相册网站制作软件,图片上的网址怎么复制?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何通过免费商城建站系统源码自定义网站主题与功能?  如何在宝塔面板中修改默认建站目录?  建站为何优先选择香港服务器? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。