Android 自定义相机Demo

本文是参考网上一些自定义相机示例,再结合自己对相机的功能需求写的,基本上包含了很多基本功能,比如相机对焦、闪光灯,以及在手机预览界面上绘制自己想要绘制的图案。

话不多说,先上一张图:

应用是在Android Studio中开发的,java程序如下:

//主程序
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;@SuppressLint("NewApi")
public class CameraActivity extends AppCompatActivity {protected static final String TAG = "main";private Camera mCamera;private CameraPreview mPreview;private static int Cur_State = 0;public ImageView imgDu;public File pictureFile;Draw draw;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera);imgDu = (ImageView) findViewById(R.id.img1);  mCamera = getCameraInstance();draw = new Draw(CameraActivity.this);// 创建预览类,并与Camera关联,最后添加到界面布局中mPreview = new CameraPreview(this, mCamera);FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);preview.addView(mPreview);preview.addView(draw);Button captureButton = (Button) findViewById(R.id.button_capture);  //button_capturecaptureButton.setOnClickListener(new View.OnClickListener() {@SuppressWarnings("deprecation")@Overridepublic void onClick(View v) {Camera.Parameters parameters = mCamera.getParameters();// 设置相片格式parameters.setJpegQuality(100);  //生成图像的质量mCamera.setParameters(parameters);parameters.setPictureFormat(ImageFormat.JPEG);// 设置预览大小parameters.setPreviewSize(800, 480);parameters.setPictureSize(4160, 3120); //生成图像的风辨率mCamera.setParameters(parameters);parameters.setRotation(90);  //生成的图像旋转90度mCamera.setParameters(parameters);parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);mCamera.setParameters(parameters);mCamera.autoFocus(new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {// 从Camera捕获图片mCamera.takePicture(null, null, mPicture);}});/*if (Cur_State < 2) {switch (Cur_State) {case 0:parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);mCamera.setParameters(parameters);mCamera.autoFocus(new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {// 从Camera捕获图片mCamera.takePicture(null, null, mPicture);}});Cur_State++;break;case 1:parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);//FLASH_MODE_OFFmCamera.setParameters(parameters);mCamera.autoFocus(new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {// 从Camera捕获图片mCamera.takePicture(null, null, mPicture);}});Cur_State++;break;}} else {Cur_State = 0;}*/}});}/** 检测设备是否存在Camera硬件 */private boolean checkCameraHardware(Context context) {if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {// 存在return true;} else {// 不存在return false;}}/** 打开一个Camera */public static Camera getCameraInstance() {Camera c = null;try {c = Camera.open();} catch (Exception e) {Log.d(TAG, "打开Camera失败失败");}return c;}private Camera.PictureCallback mPicture = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera arg1) {//将拍照得到的数据信息存储到本地File tempFile=new File("/sdcard/temp.png");try {FileOutputStream fos=new FileOutputStream(tempFile);fos.write(data);fos.close();//注意,,,然后将这个照片的数据信息传送给要进行展示的Activity即可,这部//分代码是我自己需要的,你使用时需要将他去掉修改成你的。Intent intent=new Intent(CameraActivity.this,MainActivity.class);intent.putExtra("PicturePath", tempFile.getAbsolutePath());startActivity(intent);//拍照结束之后销毁当前的Activity,进入到图片展示界面CameraActivity.this.finish();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};@Overrideprotected void onDestroy() {// 回收Camera资源if(mCamera!=null){mCamera.stopPreview();mCamera.release();mCamera=null;}super.onDestroy();}
}
/*** 定义一个预览类  预览界面设置*/
import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;@SuppressLint("NewApi")
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {private static final String TAG = "main";private SurfaceHolder mHolder;@SuppressWarnings("deprecation")private Camera mCamera;@SuppressWarnings("deprecation")public CameraPreview(Context context, Camera camera) {super(context);mCamera = camera;// 通过SurfaceView获得SurfaceHoldermHolder = getHolder();// 为SurfaceHolder指定回调mHolder.addCallback(this);mCamera.setDisplayOrientation(90);}public void surfaceCreated(SurfaceHolder holder) {// 当Surface被创建之后,开始Camera的预览try {mCamera.setPreviewDisplay(holder);mCamera.startPreview();} catch (IOException e) {Log.d(TAG, "预览失败");}}public void surfaceDestroyed(SurfaceHolder holder) {}public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {// Surface发生改变的时候将被调用,第一次显示到界面的时候也会被调用if (mHolder.getSurface() == null){// 如果Surface为空,不继续操作return;}// 停止Camera的预览try {mCamera.stopPreview();} catch (Exception e){Log.d(TAG, "当Surface改变后,停止预览出错");}// 重新开始预览try {mCamera.setPreviewDisplay(mHolder);mCamera.startPreview();} catch (Exception e){Log.d(TAG, "预览Camera出错");}}
}
/*** Created by Administrator on 2018/1/24.* 这个是在预览界面绘制图案部分*/
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;public class Draw extends View
{private Canvas canvas;//声明画笔private Paint paint;//声明画布private Paint paint1;private Paint paint2;private Bitmap bitmap;//声明位图public Draw(Context context){super(context);// TODO 自动生成的构造函数存根//创建一个画笔paint = new Paint(Paint.DITHER_FLAG);paint1 = new Paint(Paint.DITHER_FLAG);paint2 = new Paint(Paint.DITHER_FLAG);//设置位图的宽高,采用32位ARGB位图模式bitmap = Bitmap.createBitmap(720, 1280, Bitmap.Config.ARGB_8888);canvas = new Canvas(bitmap);paint.setStyle(Paint.Style.STROKE);//设置非填充paint.setStrokeWidth(2);//笔宽5像素paint.setColor(Color.RED);//设置为红笔paint.setAntiAlias(true);//锯齿不显示paint.setDither(true);//设置图像抖动处理paint.setStrokeJoin(Paint.Join.ROUND);//设置图像的结合方式paint.setStrokeCap(Paint.Cap.ROUND);//设置画笔为圆形样式paint1.setStyle(Paint.Style.FILL);//设置非填充paint1.setStrokeWidth(33);//笔宽5像素paint1.setStrokeJoin(Paint.Join.ROUND);//设置图像的结合方式paint1.setStrokeCap(Paint.Cap.ROUND);//设置画笔为圆形样式paint1.setColor(Color.BLACK);//设置为黑笔paint.setAntiAlias(true);//锯齿不显示paint.setDither(true);//设置图像抖动处理paint2.setStyle(Paint.Style.FILL);//设置填充paint2.setStrokeWidth(12);//笔宽5像素paint2.setAntiAlias(true);//锯齿不显示paint2.setDither(true);//设置图像抖动处理paint2.setStrokeJoin(Paint.Join.ROUND);//设置图像的结合方式paint2.setStrokeCap(Paint.Cap.ROUND);//设置画笔为圆形样式paint2.setColor(Color.BLACK);//设置为黑笔}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas){// TODO 自动生成的方法存根super.onDraw(canvas);canvas.drawBitmap(bitmap, 0, 0, paint);float[] pts = {0,240,260,70};canvas.drawLines(pts , paint);   //在画布上画线  1float[] pts2 = {695,522,340,1040};canvas.drawLines(pts2, paint);   //在画布上画线 2Path mPath = new Path();mPath.moveTo(260, 70);mPath.quadTo(780, 0, 695, 522);canvas.drawPath(mPath, paint);    //塞尔塔曲线Path path = new Path();      //定义一条路径path.moveTo(0,0);      //移动到 坐标(0,0)path.lineTo(0,240);path.lineTo(270,62);path.lineTo(270,0);path.lineTo(0,0);canvas.drawPath(path, paint2);Path path1 = new Path();      //定义一条路径path1.moveTo(260,0);    //移动到 坐标(260,0)path1.lineTo(720,0);path1.lineTo(720,60);path1.lineTo(260,60);path1.lineTo(260,0);canvas.drawPath(path1, paint2);Path path2 = new Path();       //定义一条路径path2.moveTo(720,60);    //移动到 坐标(720,60)path2.lineTo(720,522);path2.lineTo(715,522);path2.lineTo(715,512);path2.lineTo(700,60);path2.lineTo(720,60);canvas.drawPath(path2, paint2);Path path3 = new Path();        //定义一条路径path3.moveTo(340,1040);   //移动到 坐标(340,1040)path3.lineTo(720,1040);path3.lineTo(720,522);path3.lineTo(710,512);path3.lineTo(340,1040);canvas.drawPath(path3, paint2);Path path4 = new Path();        //定义一条路径path4.moveTo(720,200);   //移动到 坐标(715,512)path4.lineTo(500,60);path4.lineTo(720,60);path4.lineTo(720,200);canvas.drawPath(path4, paint2);float[] pts3 = {720,108,450,56};canvas.drawLines(pts3, paint2);   //在画布上画线 3float[] pts4 = {715,230,630,110};canvas.drawLines(pts4, paint1);   //在画布上画线 4float[] pts5 = {660,130,718,272};canvas.drawLines(pts5, paint1);   //在画布上画线 5float[] pts6 = {714,522,720,440};canvas.drawLines(pts6, paint1);   //在画布上画线 6}
}

布局文件 activity_camera.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><FrameLayout
        android:id="@+id/camera_preview"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"/><Button
        android:id="@+id/button_capture"android:text="拍照"android:textColor="#6633cc"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"/></LinearLayout>

应用权限:

    <uses-permission android:name="android.permission.CAMERA"/> ><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

具体的细节就不在说明,可以自己在网上搜一下相关知识,大家使用中有什么问题可以留言哦,如果能解决尽量帮大家解决。

Android 自定义相机Demo 入门学习相关推荐

  1. Android 自定义相机Demo源码

    本文转载自: https://www.cnblogs.com/linjzong/p/4201266.html 作者:linjzong 转载请注明该声明. Github源码:https://github ...

  2. android自动对焦第一次对焦,Android自定义相机实现自动对焦和手动对焦

    Android自定义相机实现自动对焦和手动对焦: 不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求. 所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此 ...

  3. android 实现自动拍照,Android自定义相机实现定时拍照功能

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

  4. Android自定义相机拍照、图片裁剪的实现

    原文:Android自定义相机拍照.图片裁剪的实现 最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类 ...

  5. android 自定义相机,Android自定义相机实现定时拍照功能

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

  6. android 自定义相机源码,Android 自定义相机及分析源码

    Android 自定义相机及分析源码 使用Android 系统相机的方法: 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 action的作用就是声明action ...

  7. Android自定义相机实现定时拍照

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

  8. Android自定义相机,切换前后摄像头,照相机拍照

    Android自定义相机,简单实现切换前后摄像头,照相机拍照 Ctrl +C  Ctrl+V 可以直接 run 起来,注释比较详细;源码下载 <?xml version="1.0&qu ...

  9. Android自定义相机

    转载请指明出处@https://blog.csdn.net/qq_41912447 版权归博主所有 /** **本文由自己搜集资料编程 如有错误请指明 **李紫洋著 */ 导引 相机成为了一个app必 ...

最新文章

  1. BurpSuite的使用总结
  2. 学python工资高吗-我程序员年薪 80 万被亲戚鄙视不如在二本教书的博士生?
  3. 检测一个网页上的链接是否都可以正常访问
  4. mysql5.7二进制包安装
  5. centos6.4安装使用wine 持续更新中
  6. 19/100. Subtree of Another Tree
  7. 数据库:30种SQL语句优化,进阶必备!
  8. Percona XtraDB Cluster 集群参数配置说明(PXC 5.7)
  9. 这100道Java面试题,面试不是什么难事了!
  10. C++中怎么调用C函数
  11. jbpm hibernate.cfg.xml 连接mysql配置_hibernate.cfg.xml文件连接mySql、Oracle、SqlServer配置...
  12. 使用Directshow + LAVFilter做一个万能格式的多媒体播放器
  13. 上汽拿下国内首张道路测试用牌照
  14. Playbook特殊用法
  15. 股票查询接口常见的证券编码规则是怎样的?
  16. 谁动了我的奶酪 读后感
  17. 蓝桥杯嵌入式国赛模块训练之数码管
  18. APIDOC使用教程
  19. C语言:编写一个程序判断一个数是否为素数/
  20. 方正小样文件转换HTML

热门文章

  1. 学习笔记,初学者对继承、接口的习题练习: 模拟给所有员工发工资定义员工Employee类,经理Manager类继承Employee类,职员Clerk类继承Employee类。
  2. 安装miniconda出现丢失api-mis-win-core-path-l1-1-0.dll的解决方案
  3. java解析SZY206-2016传输规约
  4. 区块链报错 5 | Contract has not been deployed to detect network (network/artifact mismatch)
  5. 微信公众号发送消息 Java
  6. IOS截屏的几种方法
  7. 微信为什么打不开html,微信打不开怎么回事_手机微信打不开怎么办【图文】-太平洋电脑网PConline-太平洋电脑网...
  8. Kubernetes Deployment控制器(二十)
  9. 固态硬盘简称是不是ssd_【科普】这是不常用的术语,但对SSD固态硬盘很重要
  10. [Python]链式赋值(Chained assignment)