本文实例为大家分享了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站点访问权限与数据传输安全?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
实例解析Array和String方法
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
香港服务器网站卡顿?如何解决网络延迟与负载问题?
香港服务器租用费用高吗?如何避免常见误区?
如何通过智能用户系统一键生成高效建站方案?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
建站之星如何实现网站加密操作?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
如何挑选优质建站一级代理提升网站排名?
如何通过云梦建站系统实现SEO快速优化?
如何在企业微信快速生成手机电脑官网?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
网页设计网站制作软件,microsoft office哪个可以创建网页?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
常州企业建站如何选择最佳模板?
再谈Python中的字符串与字符编码(推荐)
如何挑选最适合建站的高性能VPS主机?
如何快速选择适合个人网站的云服务器配置?
长沙做网站要多少钱,长沙国安网络怎么样?
如何选择高效稳定的ISP建站解决方案?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何在IIS7上新建站点并设置安全权限?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
如何通过NAT技术实现内网高效建站?
如何在搬瓦工VPS快速搭建网站?
北京网站制作的公司有哪些,北京白云观官方网站?
定制建站价位费用解析与套餐推荐全攻略
建站主机选购指南与交易推荐:核心配置解析
建站主机与服务器功能差异如何区分?
如何做网站制作流程,*游戏网站怎么搭建?
如何在景安云服务器上绑定域名并配置虚拟主机?
北京网站制作网页,网站升级改版需要多久?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
安徽网站建设与外贸建站服务专业定制方案
北京专业网站制作设计师招聘,北京白云观官方网站?
盐城做公司网站,江苏电子版退休证办理流程?
如何在IIS中配置站点IP、端口及主机头?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
,想在网上投简历,哪几个网站比较好?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
如何用已有域名快速搭建网站?
活动邀请函制作网站有哪些,活动邀请函文案?
如何快速查询网址的建站时间与历史轨迹?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
太原网站制作公司有哪些,网约车营运证查询官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。