创建自定义相机界面调用Camera来实现拍照功能。如左图:上方是一个CAPTURE按钮,下方是用来实时显示摄像头预览画面的SurfaceView,通过点击CAPTURE按钮进行拍照,并将拍摄的图片显示到一个新的活动界面,新的活动界面如右图:上方是一个TextView,下方是一个ImageView显示拍摄好的照片。

拍摄界面的活动代码如下:

CustomCamera.javapublic class CustomCamera extends AppCompatActivity implements SurfaceHolder.Callback {

private Camera mCamera;

private SurfaceView mPreview;

private SurfaceHolder mHolder;

private Uri imageUri;

private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

@Override//参数data保存了拍摄好的照片信息

public void onPictureTaken(byte[] data, Camera camera) {

File outputImage = new File(Environment.getExternalStorageDirectory(),

"output_image.jpg");

try {

if (outputImage.exists()) {

outputImage.delete();

}

outputImage.createNewFile();

FileOutputStream fos = new FileOutputStream(outputImage);

fos.write(data);

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

if (Build.VERSION.SDK_INT >= 24) {

//通过FileProvider.getUriForFile获取URL,参数2应该与Provider在AndroidManifest.xml中定义的authorities标签一致

imageUri = FileProvider.getUriForFile(CustomCamera.this, "com.example.cameratest.provider", outputImage);

} else {

imageUri = Uri.fromFile(outputImage);

}

Intent intent = new Intent(CustomCamera.this, ResultAty.class);

intent.setData(imageUri);//传递存储照片地址的uri

startActivity(intent);

CustomCamera.this.finish();

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.custom);

mPreview = findViewById(R.id.preview);

mHolder = mPreview.getHolder();

mHolder.addCallback(this);

mPreview.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mCamera.autoFocus(null);

}

});

}

public void btnCapture(View view) {

Camera.Parameters parameters = mCamera.getParameters();//获取各项参数

parameters.setPictureFormat(ImageFormat.JPEG);//设置图片格式

parameters.setPreviewSize(1920, 1080);//设置预览大小

parameters.setPictureSize(1920, 1080);//设置保存的图片大小

parameters.setJpegQuality(100);//设置照片质量

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置自动对焦

mCamera.setParameters(parameters);

//获取最清晰的焦距后再进行操作

mCamera.autoFocus(new Camera.AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

//如果对焦已经完成

if (success) {

//相机拍照,回调参数3用来完成拍摄后所处理的操作

mCamera.takePicture(null, null, mPictureCallback);

}

}

});

}

@Override

protected void onResume() {

super.onResume();

if (mCamera == null) {

mCamera = getCamera();

if (mHolder != null) {

setStartPreview(mCamera, mHolder);

}

}

}

@Override

protected void onPause() {

super.onPause();

releaseCamera();

}

/**

* 获取系统的Camera对象

*

* @return

*/

private Camera getCamera() {

Camera camera;

try {

camera = Camera.open(0);//参数0和1,表示后和前摄像头

} catch (Exception e) {

camera = null;

e.printStackTrace();

}

return camera;

}

/**

* 开始预览相机内容

*/

private void setStartPreview(Camera camera, SurfaceHolder holder) {

try {

camera.setPreviewDisplay(holder);//绑定Camera和SurfaceHolder

camera.setDisplayOrientation(90);//将系统camera预览角度进行调整

camera.startPreview();//开始在surfaceview中预览相机图像

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 释放相机资源

*/

private void releaseCamera() {

if (mCamera != null) {

mCamera.setPreviewCallback(null);

mCamera.stopPreview();//停止相机预览

mCamera.release();//释放相机资源

mCamera = null;

}

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

setStartPreview(mCamera, mHolder);

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

mCamera.stopPreview();

setStartPreview(mCamera, mHolder);

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

releaseCamera();

}

}

拍摄界面的布局代码如下:

custom.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:onClick="btnCapture"

android:text="Capture" />

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/preview"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:text="Welcome to my camera"

android:textColor="@android:color/holo_red_light"

android:textSize="20sp" />

显示界面的活动代码如下:

ResultAty.javapublic class ResultAty extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.result);

ImageView imageview = findViewById(R.id.pic);

//获取照片的uri

Uri uri = getIntent().getData();

//将获取到的照片旋转90度竖向显示

Matrix matrix = new Matrix();

matrix.setRotate(90);

Bitmap bitmap;

try {

bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));

} catch (FileNotFoundException e) {

bitmap = null;

e.printStackTrace();

}

bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

imageview.setImageBitmap(bitmap);

}

}

显示界面的布局代码如下:

result.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:text="Capture result"

android:textSize="30dp" />

android:id="@+id/pic"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scaleType="center" />

本例用到了FileProvider来产生文件的Uri,具体设置参考笔记《Android调用系统相机》

android 自定义相机,Android自定义相机Camera基础相关推荐

  1. Android 拍身份证(自定义相机)

    Android自定义相机拍摄二代身份证. 感谢开源,尊重他人劳动成果,本自定义相机拍照核心逻辑取自云栖社区上Android 手把手带你玩转自定义相机 文章,本文仅仅在此基础上再次封装了返回拍照地址等监 ...

  2. android camera 显示过程,Android相机Camera基础知识

    一.概述本章节主要讲述的Android相机Camera的相关知识点,主要包含三个方面,Android启动系统相机生成缩略图.Android启动系统相机生成原图以及Android自定义相机等. 二.An ...

  3. 【Android 开发】SufaceView自定义相机拍照

    前段时间写了关于一篇关于调用系统相机的博客,如果需要调用系统相机和截图可以看一看这篇博客:Android学习之调用系统相机拍照.截图并保存最近发现不同手机,调用系统相机效果不太好,,所以学习Andro ...

  4. Android相机Camera基础

    一.概述 本章节主要讲述的Android相机Camera的相关知识点,主要包含三个方面,Android启动系统相机生成缩略图.Android启动系统相机生成原图以及Android自定义相机等. 二.A ...

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

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

  6. android drawable 比例,Android中的Drawable基础与自定义Drawable

    转载请注明链接:http://blog..net/feather_wch/article/details/79124608 本文要点: 1. 介绍Android中Drawable的相关知识点,并且介绍 ...

  7. 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo

    杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能. ...

  8. Android 最简单的自定义证件照Mask之一

    作者: Jooyer, 时间: 2019.01.08 Github地址,欢迎点赞,fork 现在部分APP都有一个身份认证,一般需要身份证正面,反面,在度娘那也有很多,我发现他们在属性配置上略少了一些 ...

  9. android水印相机,Android 水印相机开发

    水印相机是自定义相机的一种,实现方法有很多,我看了很多别人的做的很漂亮,我做的就很普通了,不过总算是实现了拍照加水印的功能. 我这边用到了SurfaceView,有人没用这个也做出来水印相机,个人觉得 ...

最新文章

  1. cmw500综合测试仪使用_宁波摆闸静电测试仪价格-老友网
  2. #include 和 #include 的区别
  3. jQuery 对象和 DOM 对象
  4. 采用SIMULINK SimPowerSystems的光伏并网阵列仿真
  5. leetcode104 二叉树的最大深度
  6. 对C语言进行调试的最好方法是什么?
  7. openoffice 安装windows 环境
  8. 线程之间的通信(thread signal)
  9. 我的购机(手机)之路
  10. 对话|俞栋:在人工智能的很多应用场景,语音识别是一个入口
  11. android 源码打patch
  12. 中国邮政支付宝卡通开通流程
  13. 没想到,区块链竟然是这样的!
  14. Hyperf初体验-JsonRpc的使用
  15. qq音乐api接口梳理
  16. win10下如何关闭445端口,教程演示
  17. Java-基础篇-03-【选择语句-循环语句-随机数】
  18. 常用网络故障排除命令介绍
  19. linux设置进程优先级工具,linux性能分析优化之基础指标参数(3) - 进程优先级 cpu nice priority NI PR %ni %nice...
  20. 【论文笔记】DR-TANet: Dynamic Receptive Temporal Attention Network for Street Scene Change Detection

热门文章

  1. 计算机速录等级考试时间,全国计算机速录等级考试三级考试大纲
  2. Matlab中xlabel函数的使用
  3. 数据库性能优化八大方案,你知道几个
  4. Linux快速学习-进程号端口查询
  5. c语言构成数组的各个元素,c语言习题六(数组部分)习题及答案.doc
  6. 量子计算机相同数字相加怎么算,量子计算机如何分解两个质数乘积
  7. java 生成json数据_解析和生成JSON数据
  8. mono for android mysql_unity跨平台sqlite使用教程
  9. mysql 从库_通过两种方式增加从库——不停止mysql服务
  10. 停止服务[root@dev WAS]# /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/stopServer.sh server1