android 自定义相机,Android自定义相机Camera基础
创建自定义相机界面调用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基础相关推荐
- Android 拍身份证(自定义相机)
Android自定义相机拍摄二代身份证. 感谢开源,尊重他人劳动成果,本自定义相机拍照核心逻辑取自云栖社区上Android 手把手带你玩转自定义相机 文章,本文仅仅在此基础上再次封装了返回拍照地址等监 ...
- android camera 显示过程,Android相机Camera基础知识
一.概述本章节主要讲述的Android相机Camera的相关知识点,主要包含三个方面,Android启动系统相机生成缩略图.Android启动系统相机生成原图以及Android自定义相机等. 二.An ...
- 【Android 开发】SufaceView自定义相机拍照
前段时间写了关于一篇关于调用系统相机的博客,如果需要调用系统相机和截图可以看一看这篇博客:Android学习之调用系统相机拍照.截图并保存最近发现不同手机,调用系统相机效果不太好,,所以学习Andro ...
- Android相机Camera基础
一.概述 本章节主要讲述的Android相机Camera的相关知识点,主要包含三个方面,Android启动系统相机生成缩略图.Android启动系统相机生成原图以及Android自定义相机等. 二.A ...
- android 自定义相机,Android自定义相机实现定时拍照功能
这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能. 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_main.xml andro ...
- android drawable 比例,Android中的Drawable基础与自定义Drawable
转载请注明链接:http://blog..net/feather_wch/article/details/79124608 本文要点: 1. 介绍Android中Drawable的相关知识点,并且介绍 ...
- 玩转Android Camera开发(一):Surfaceview预览Camera,基础拍照功能完整demo
杂家前文是在2012年的除夕之夜仓促完成,后来很多人指出了一些问题,琐事缠身一直没有进行升级.后来随着我自己的使用,越来越发现不出个升级版的demo是不行了.有时候就连我自己用这个demo测一些性能. ...
- Android 最简单的自定义证件照Mask之一
作者: Jooyer, 时间: 2019.01.08 Github地址,欢迎点赞,fork 现在部分APP都有一个身份认证,一般需要身份证正面,反面,在度娘那也有很多,我发现他们在属性配置上略少了一些 ...
- android水印相机,Android 水印相机开发
水印相机是自定义相机的一种,实现方法有很多,我看了很多别人的做的很漂亮,我做的就很普通了,不过总算是实现了拍照加水印的功能. 我这边用到了SurfaceView,有人没用这个也做出来水印相机,个人觉得 ...
最新文章
- cmw500综合测试仪使用_宁波摆闸静电测试仪价格-老友网
- #include 和 #include 的区别
- jQuery 对象和 DOM 对象
- 采用SIMULINK SimPowerSystems的光伏并网阵列仿真
- leetcode104 二叉树的最大深度
- 对C语言进行调试的最好方法是什么?
- openoffice 安装windows 环境
- 线程之间的通信(thread signal)
- 我的购机(手机)之路
- 对话|俞栋:在人工智能的很多应用场景,语音识别是一个入口
- android 源码打patch
- 中国邮政支付宝卡通开通流程
- 没想到,区块链竟然是这样的!
- Hyperf初体验-JsonRpc的使用
- qq音乐api接口梳理
- win10下如何关闭445端口,教程演示
- Java-基础篇-03-【选择语句-循环语句-随机数】
- 常用网络故障排除命令介绍
- linux设置进程优先级工具,linux性能分析优化之基础指标参数(3) - 进程优先级 cpu nice priority NI PR %ni %nice...
- 【论文笔记】DR-TANet: Dynamic Receptive Temporal Attention Network for Street Scene Change Detection
热门文章
- 计算机速录等级考试时间,全国计算机速录等级考试三级考试大纲
- Matlab中xlabel函数的使用
- 数据库性能优化八大方案,你知道几个
- Linux快速学习-进程号端口查询
- c语言构成数组的各个元素,c语言习题六(数组部分)习题及答案.doc
- 量子计算机相同数字相加怎么算,量子计算机如何分解两个质数乘积
- java 生成json数据_解析和生成JSON数据
- mono for android mysql_unity跨平台sqlite使用教程
- mysql 从库_通过两种方式增加从库——不停止mysql服务
- 停止服务[root@dev WAS]# /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/stopServer.sh server1