本文实例为大家分享了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站点实现文件共享?
MySQL查询结果复制到新表的方法(更新、插入)
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
如何解决VPS建站LNMP环境配置常见问题?
购物网站制作公司有哪些,哪个购物网站比较好?
建站主机与虚拟主机有何区别?如何选择最优方案?
设计网站制作公司有哪些,制作网页教程?
建站之星后台密码遗忘如何找回?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何快速搭建支持数据库操作的智能建站平台?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
javascript中对象的定义、使用以及对象和原型链操作小结
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
建站之星安装提示数据库无法连接如何解决?
盘锦网站制作公司,盘锦大洼有多少5G网站?
,巨量百应是干嘛的?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
如何高效完成独享虚拟主机建站?
c++怎么用jemalloc c++替换默认内存分配器【性能】
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
营销式网站制作方案,销售哪个网站招聘效果最好?
如何用已有域名快速搭建网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
建站之星如何优化SEO以实现高效排名?
想学网站制作怎么学,建立一个网站要花费多少?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
,南京靠谱的征婚网站?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
网站制作话术技巧,网站推广做的好怎么话术?
如何在七牛云存储上搭建网站并设置自定义域名?
如何通过虚拟主机快速完成网站搭建?
制作网页的网站有哪些,电脑上怎么做网页?
如何在云主机快速搭建网站站点?
Android自定义listview布局实现上拉加载下拉刷新功能
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
油猴 教程,油猴搜脚本为什么会网页无法显示?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何零基础在云服务器搭建WordPress站点?
如何快速搭建响应式可视化网站?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何在Golang中指定模块版本_使用go.mod控制版本号
相册网站制作软件,图片上的网址怎么复制?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何通过免费商城建站系统源码自定义网站主题与功能?
如何在宝塔面板中修改默认建站目录?
建站为何优先选择香港服务器?
*请认真填写需求信息,我们会在24小时内与您取得联系。