我的编程空间,编程开发者的网络收藏夹
学习永远不晚

android中怎么通过自定义Camera实现拍照

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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、获取相机并开启预览

  private Camera getcCamera() {    Camera camera = null;    try {      camera = Camera.open();    } catch (Exception e) {      camera = null;    }    return camera;  }
  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);      }    });  }     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;  }}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

android中怎么通过自定义Camera实现拍照

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

android中怎么通过自定义Camera实现拍照

android中怎么通过自定义Camera实现拍照,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、打开相机a.预览拍摄图片,需用到SurfaceView,并且
2023-05-31

Android怎么自定义Camera实现拍照小功能

这篇文章主要介绍“Android怎么自定义Camera实现拍照小功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义Camera实现拍照小功能”文章能帮助大家解决问题。首先实现
2023-06-30

Android自定义相机实现定时拍照功能

这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能。首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件:activity_main.xml2022-06-06

Android中怎么通过自定义View实现画圆

Android中怎么通过自定义View实现画圆,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。引入布局
2023-05-30

Android中怎么通过自定义view实现TopBar效果

这篇文章给大家介绍Android中怎么通过自定义view实现TopBar效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。布局文件
2023-05-30

Android中怎么实现拍照功能

这期内容当中小编将会给大家带来有关Android中怎么实现拍照功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。解析:1)判断是否有摄像头checkCameraHardware(this) 2)获得相机c
2023-05-30

Android中怎么通过自定义view实现动态柱状图

这篇文章将为大家详细讲解有关Android中怎么通过自定义view实现动态柱状图,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。自定义viewpublic class Histogram ex
2023-05-30

Android中怎么通过自定义View 实现QQ侧滑菜单

这期内容当中小编将会给大家带来有关Android中怎么通过自定义View 实现QQ侧滑菜单,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。布局代码
2023-05-30

Android中怎么通过自定义RecyclerView控件实现Gallery效果

这期内容当中小编将会给大家带来有关Android中怎么通过自定义RecyclerView控件实现Gallery效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、RecyclerView的基本用法首先主
2023-05-30

Android中怎么通过自定义View实现圆形切图效果

本篇文章给大家分享的是有关Android中怎么通过自定义View实现圆形切图效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现思路使用一个Paint,将得到的Bitmap设
2023-05-30

怎么在Android中通过自定义View实现一个扫描效果

这篇文章给大家介绍怎么在Android中通过自定义View实现一个扫描效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。自定义属性:
2023-06-14

Android中怎么通过自定义控件实现下拉刷新效果

本篇文章给大家分享的是有关Android中怎么通过自定义控件实现下拉刷新效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。@Override protected void o
2023-05-30

怎么在Android中通过自定义view实现滑动解锁效果

怎么在Android中通过自定义view实现滑动解锁效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。自定义view如下@SuppressLint("ClickableVi
2023-06-15

Android中怎么通过自定义view实现进度条加载效果

Android中怎么通过自定义view实现进度条加载效果,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。分析图:代码如下:package com.example.dotloa
2023-05-30

怎么在Android中通过自定义View实现一个抽屉效果

怎么在Android中通过自定义View实现一个抽屉效果?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android 自定义View实现抽屉效果说明这个自定义V
2023-05-31

Android通过自定义View实现随机验证码

很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章。 一、问题描述熟悉web开发中童鞋们都知道为了防止恶意破解、恶意提交
2022-06-06

Android通过自定义Activity实现悬浮的Dialog详解

前言其实实现悬浮的自定义窗体有很多方法,自定义Dialog,自定义layout 均可以实现。自定义activity也是可以的,今天我就介绍一下activity的实现方法。下面来看看详细的介绍:效果图如图可以看出,当前的窗体,第一眼其实和di
2023-05-31

Android中怎么通过自定义ImageView添加文字说明

本篇文章为大家展示了Android中怎么通过自定义ImageView添加文字说明,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MyImageTextViewNew.javapublic class
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录