Android编程实现拍照功能的2种方法分析
发布时间 - 2026-01-11 02:31:19 点击率:次本文实例讲述了Android编程实现拍照功能的2种方法。分享给大家供大家参考,具体如下:

Android系统的照相功能,已实现2种方法,可供大家参考:
1. 调用系统摄像头来拍照
首先,找到AndroidManifest.xml文件里加入用户权限
<uses-permission android:name="android.permission.CAMERA"></uses-permission> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
其次,在主类Java文件里加入2个控件(button和imageview),是用来触发按钮事件和显示图片的,纯是个人爱好
final int TAKE_PICTURE = 1; //为了表示返回方法中辨识你的程序打开的相机
关键是这里:
复制代码 代码如下:startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);
是打开系统自带相机,以下是处理拍照得到的数据,将数据保存下来
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TAKE_PICTURE) {
if (resultCode == RESULT_OK) {
Bitmap bm = (Bitmap) data.getExtras().get("data");
img.setImageBitmap(bm);//想图像显示在ImageView视图上,private ImageView img;
File myCaptureFile = new File("sdcard/123456.jpg");
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
/* 采用压缩转档方法 */
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
/* 调用flush()方法,更新BufferStream */
bos.flush();
/* 结束OutputStream */
bos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这样就能实现调用系统自带的摄像头了,很简单的操作。
2. 自己写程序来保存照片
照片格局文件lay.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" > <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="130px" android:paddingRight="200px" > <SurfaceView android:id="@+id/mSurfaceView1" android:visibility="visible" android:layout_width="320px" android:layout_height="240px"> </SurfaceView> </LinearLayout> </LinearLayout>
其中SurfaceView是用来进行预览的,
在Oncreat函数里初始化一系列的值:
requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.lay); /* 取得屏幕解析像素 */ DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); // mImageView01 = (ImageView) findViewById(R.id.myImageView1); /* 以SurfaceView作为相机Preview之用 */ mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1); /* 绑定SurfaceView,取得SurfaceHolder对象 */ mSurfaceHolder01 = mSurfaceView01.getHolder(); /* Activity必须实现SurfaceHolder.Callback */ mSurfaceHolder01.addCallback(takephoto.this); /* * 以SURFACE_TYPE_PUSH_BUFFERS(3) * 作为SurfaceHolder显示类型 * */ mSurfaceHolder01.setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
首先进行初始化照相机的功能函数和参数设置:
private Camera mCamera01; mCamera01 = Camera.open(); /* 创建Camera.Parameters对象 */ Camera.Parameters parameters = mCamera01.getParameters(); /* 设置相片格式为JPEG */ parameters.setPictureFormat(PixelFormat.JPEG); Log.i(TAG, "pic is jpeg"); /* 指定preview的屏幕大小 */ parameters.setPreviewSize(320, 240); Log.i(TAG, "pic pingmu fenbianlv"); /* 设置图片分辨率大小 */ parameters.setPictureSize(1024, 768); Log.i(TAG, "pic tupian fenbianlv"); /* 将Camera.Parameters设置予Camera */ mCamera01.setParameters(parameters); /* setPreviewDisplay唯一的参数为SurfaceHolder */ mCamera01.setPreviewDisplay(mSurfaceHolder01); /* 立即运行Preview */ mCamera01.startPreview();
初始化成功后就可以进行拍照了,拍照函数依然是通过调用camera类的函数来实现
复制代码 代码如下:mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback);
只需实现jpegCallback这个回调函数来就行解码、保存即可,前2个参数可以直接设为null,不过系统一般会自动帮你把这些都写进来的
private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle JPEG image data
/* onPictureTaken传入的第一个参数即为相片的byte */
Bitmap bm = BitmapFactory.decodeByteArray
(_data, 0, _data.length);
/* 创建新文件 */
picname = "sdcard/1234566.jpg";//要保存在哪里,路径你自己设
File myCaptureFile = new File(picname);
try
{
BufferedOutputStream bos = new BufferedOutputStream
(new FileOutputStream(myCaptureFile));
/* 采用压缩转档方法 */
bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
/* 调用flush()方法,更新BufferStream */
bos.flush();
/* 结束OutputStream */
bos.close();
/* 将拍照下来且存储完毕的图文件,显示出来 */
//mImageView01.setImageBitmap(bm);
/* 显示完图文件,立即重置相机,并关闭预览 */
resetCamera();
}
catch (Exception e)
{
Log.e(TAG, e.getMessage());
}
}
};
拍照完了要重置照相机,然后可以继续拍照
/* 相机重置 */
private void resetCamera()
{
if (mCamera01 != null && bIfPreview)
{
mCamera01.stopPreview();
/* 扩展学习,释放Camera对象 */
mCamera01.release();
mCamera01 = null;
bIfPreview = false;
}
}
2种拍照方式的比较
①. 调用系统自带的照相机,照片格式大小只有几种选择,照片拍出来比较大,而自己程序实现的话可以调节照片大小为任意尺寸,图片的容量可以调节
②. 调用系统的简单,而且外观一般比自己设置的要好看
③. 调用系统的操作简单、方便,不易出错,自己编程的话需要注意,容易引起系统出错意外终止
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android拍照与图片处理技巧总结》、《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
# Android
# 拍照功能
# Android判断是否有拍照权限的实例代码
# Android编程调用系统自带的拍照功能并返回JPG文件示例【附demo源码下载】
# Android仿微信单击拍照长按录像功能实例代码
# Android SurfaceView拍照录像实现方法
# Android 7.0中拍照和图片裁剪适配的问题详解
# Android自定义组件获取本地图片和相机拍照图片
# Android 实现IOS选择拍照相册底部弹出的实例
# 系统自带
# 种方法
# 进阶
# 相关内容
# 第一个
# 就能
# 是用来
# 只需
# 设为
# 你自己
# 感兴趣
# 就行
# 给大家
# 很简单
# 可以直接
# 几种
# 可供
# 要先
# 你把
# 头来
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Vite进行前端资源打包?(配置示例)
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
网站制作壁纸教程视频,电脑壁纸网站?
jQuery validate插件功能与用法详解
Laravel如何使用Telescope进行调试?(安装和使用教程)
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
Python高阶函数应用_函数作为参数说明【指导】
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何创建自定义Artisan命令?(代码示例)
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
如何自定义建站之星模板颜色并下载新样式?
如何在景安服务器上快速搭建个人网站?
Laravel如何使用.env文件管理环境变量?(最佳实践)
Android滚轮选择时间控件使用详解
Python图片处理进阶教程_Pillow滤镜与图像增强
如何有效防御Web建站篡改攻击?
JavaScript如何实现路由_前端路由原理是什么
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
如何用狗爹虚拟主机快速搭建网站?
如何快速搭建高效简练网站?
网页设计与网站制作内容,怎样注册网站?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
如何在Ubuntu系统下快速搭建WordPress个人网站?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
实例解析Array和String方法
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
WordPress 子目录安装中正确处理脚本路径的完整指南
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何在橙子建站中快速调整背景颜色?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
零基础网站服务器架设实战:轻量应用与域名解析配置指南
如何获取免费开源的自助建站系统源码?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Linux网络带宽限制_tc配置实践解析【教程】
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
上一篇:nginx监控工具免费
下一篇:苹果iOS17.5维修模式有啥用
上一篇:nginx监控工具免费
下一篇:苹果iOS17.5维修模式有啥用

