欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现拍照及图片显示效果

程序员文章站 2023-12-03 23:10:40
本文实例为大家分享了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);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。