Android实现拍照及图片显示效果
程序员文章站
2024-02-08 08:26:58
本文实例为大家分享了android拍照及图片显示的具体代码,供大家参考,具体内容如下
1、功能声明
当应用需要使用相机、nfc等外设时,需要在androidman...
本文实例为大家分享了android拍照及图片显示的具体代码,供大家参考,具体内容如下
1、功能声明
当应用需要使用相机、nfc等外设时,需要在androidmanifest.xml中进行声明。
这样,当设备缺少这些外设时,应用商店的安装程序可以拒绝安装设备。
声明示例代码如下:
<uses-feature android:name="android.hardware.camera2" <!-- required为false时,不强制要求设备支持该功能 --> <!-- 如果不设置该值,一旦设备不支持camera,就不能安装该应用--> android:required="false"/>
2、创建指向文件的file对象
拍摄的照片可以存放到设备的外部存储区。
android为不同的应用分配的独有的存储区域,同时按照存储数据的类型对存储区域做了进一步地划分。
设置照片存储区域的代码示例如下所示:
public file getphotofile(crime crime) { //获取应用对应的存储照片的外部存储路径 file externalfilesdir = mcontext .getexternalfilesdir(environment.directory_pictures); if (externalfilesdir == null) { return null; } //创建指向文件的file对象 return new file(externalfilesdir, crime.getphotofilename()); } ............. //每个crime对应的文件名 public string getphotofilename() { return "img_" + getid().tostring() + ".jpg"; }
3、触发拍照
可以使用mediastore.action_capture_image类型的intent触发拍照,示例代码如下:
mphotobutton = (imagebutton) v.findviewbyid(r.id.crime_camera); //隐式intent触发相机拍照 final intent captureimageintent = new intent(mediastore.action_image_capture); //mphotofile保存着上文创建的指向指定地址的file //此处判断是否有能够处理隐式intent的组件 boolean cantakephoto = mphotofile != null && captureimageintent.resolveactivity(packagemanager) != null; mphotobutton.setenabled(cantakephoto); if (cantakephoto) { //得到file文件对应的uri地址 uri uri = uri.fromfile(mphotofile); //将uri地址存入到intent中,相机拍照得到的图像将会存入到该uri地址对应的file里 captureimageintent.putextra(mediastore.extra_output, uri); } mphotobutton.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { startactivityforresult(captureimageintent, request_photo); } });
4、处理拍照结果
拍照完成后,将可以加载得到图片了。
@override public void onactivityresult(int requestcode, int resultcode, intent data) { ......... } else if (requestcode == request_photo) { updatephotoview(); } ......... } private void updatephotoview() { if (mphotofile == null || !mphotofile.exists()) { mphotoview.setimagedrawable(null); } else { //加载图片对应的缩略图 bitmap bitmap = pictureutils.getscaledbitmap(mphotofile.getpath(), getactivity()); mphotoview.setimagebitmap(bitmap); } }
bitmap只存储实际像素数据,因此即使原始照片已经压缩过,但存入bitmap对象时,文件并不会被压缩。
因此加载图片时,需要先按照给定区域的大小合理的缩放文件。 然后,用bitmap加载缩放后的文件,示例代码如下:
//在具体视图未加载前,无法得到视图的实际大小 //因此根据屏幕尺寸,使用估算值进行缩放 public static bitmap getscaledbitmap(string path, activity activity) { point size = new point(); activity.getwindowmanager().getdefaultdisplay().getsize(size); return getscaledbitmap(path, size.x, size.y); } public static bitmap getscaledbitmap(string path, int destwidth, int destheight) { bitmapfactory.options options = new bitmapfactory.options(); options.injustdecodebounds = true; //按照正常尺寸解析文件 bitmapfactory.decodefile(path, options); //得到原始文件的宽和高 float srcwidth = options.outwidth; float srcheight = options.outheight; //insamplesize表示水平/竖直抽样比 //例如,insamplesize为2时,水平和数值均在原始基础上,每2个点抽取1个点 //于是,新图的大小变为原来的1/4 int insamplesize = 1; if (srcheight > destheight || srcwidth > destwidth) { if (srcwidth > srcheight) { insamplesize = math.round(srcheight / destheight); } else { insamplesize = math.round(srcwidth / destwidth); } } options = new bitmapfactory.options(); options.insamplesize = insamplesize; //按新的抽样比,重新解析文件 return bitmapfactory.decodefile(path, options); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: javascript中BOM基础知识总结
下一篇: 淘宝双12全民寻宝怎么快速解锁地图?
推荐阅读