热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android使用系统相机进行拍照的步骤

这篇文章主要介绍了Android使用系统相机进行拍照的步骤,帮助大家更好的进行Android开发,感兴趣的朋友可以了解下

前言

我们在日常的开发中有时候会遇到需要用到相机的需求,而相机也是很常用的东西,例如扫二维码啊拍照上传啊等等。这里我不讲像qq那样自定义很强的拍照功能(事实上我也不会),讲个最简单的调用系统相机拍照并储存

调用系统相机步骤

这里我通过一个简单的例子来讲这个内容。
我自己写了一个demo,布局很简单:

就是一个按钮点击弹起相机,然后一个imageView显示拍到的照片。

接下来我想一下调用的整个过程我们需要做什么:
首先弹起相机肯定要跳到相机这个应用,那么就必须通过隐性启动相机的活动。
然后当我们返回应用的时候,还要将照片显示,所以这里就要用到startActivityForResult这个方法。
其次,我们拍照之后肯定要进行储存的,那么就涉及到文件的操作。
涉及到内存的操作就肯定要和权限打交道,所有还有权限相关的内容。
最后还有一个问题就是,相机拍完照是要储存照片的,所以我们要给他一个地址uri,但是可不可以直接把地址当成参数发过去呢?这里就要用到特殊的内容提供器FileProvider。
上面就是调用相机要用到的内容,虽然用的都很浅,但是都会涉及到。接下来看看具体怎么实现。看看Activity中的onCreate的代码:

 private Uri imageUri;
 private ImageView imageView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 imageView = findViewById(R.id.imageView);

 Button button = findViewById(R.id.button);
 button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {

  //创建一个File对象。getExternalCacheDir()获取应用的缓存目录,outputImage.jpg是照片名称
  File outputImage = new File(getExternalCacheDir(),"outputImage.jpg");
  try{  
  //创建一个空文件  
   outputImage.createNewFile();
  }catch (IOException e){
   e.printStackTrace();
  }

  //不同的安卓版本对用不同的获取Uri的方法
  if (Build.VERSION.SDK_INT>=24){
   imageUri =FileProvider.getUriForFile(MainActivity.this,"huan",outputImage);
  }else{
   imageUri = Uri.fromFile(outputImage);
  }

  //启动相机的对应Activity
  Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
  intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
  startActivityForResult(intent,1);
  }
 });

我们来看看这里的代码:前面的代码很简单就是控件的初始化。
我们知道照片是要放文件夹得,所以这里要创建一个File对象,指定文件的路径以及名字。这里路径为什么要用getExternalCacheDir()呢?因为每个应用都有对应得缓存目录,访问这些目录得时候不用访问内存权限,这样得话就可以省去需求权限得步骤啦。这个目录在/scare/Android/data//cache。

然后我们再创建一个空的文件夹。这里如果已经有照片了的话例如我们第二次拍照的时候,那么就不会创建新的空文件夹了。直到储存的时候才会被替换掉。

然后我们刚才讲到,拍到的图片要在我们的应用中展示,那么就必须用到内容提供器。这里用到FileProvider来获取uri,关于provider我在下文有讲到可以
如果是低于4.4版本的安卓就用Uri.fromFile(outputImage);方法可以获取到uri

再通过隐式启动相机activity可以打开相机了。这里系统相机的action是android.media.action.IMAGE_CAPTURE,相机储存路径的参数名字是MediaStore.EXTRA_OUTPUT,并把uri传输进去。

好了这样就完成了拍照并把照片储存的步骤了。接下来还差什么?对了,把照片显示出来。现在在内存中已经有这个照片了,而且uri也知道,所以就很容易了,看代码:

 @Override
 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
 if (requestCode == 1) {
  if (resultCode == RESULT_OK)
  try {
   Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
   imageView.setImageBitmap(bitmap);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }
 }

我们刚才使用startActivityForResult来启动活动的,所以就要重写这个方法来显示图片了。这里首先判断是哪个启动命令,然后再判断是否成功启动,再BitmapFactory.decodeStream这个方法来获取bitmap,再把bitmap显示出来就行了。BitmapFactory.decodeStream这个方法需要一个流,可以通过getContentResolver().openInputStream这个方法来开启一个流。

到此整个流程就解决了。

FileProvider

FileProvider是一个特殊的内容提供器,可以把一个file开头的uri改成content开头的,例如:file://uri -> content://uri。那为什么要这么做呢?这里简单讲一下:
这个是因为在Android 7.0之后,官方禁止直接把一个真实路径的uri传输到别的应用,而我们要把地址送给相机,所以就会出现问题了。详细可以查阅这篇博客:Android 7.0 行为变更 通过FileProvider在应用间共享文件吧

既然是内容提供器那么肯定是要进行注册的:


  
 

这里的authorities参数必须和前面的getUriForFile方法的第二个参数保持一致,同个内容提供器的authorities肯定要一样啦。grantUriPermissions参数一定要是true,这个的大概意思就是给他的所有元素授权可以被访问,在FileProvider中这个参数必须是true(这也是为什么在4.4一下版本的安卓无法使用的原因之一,有兴趣可以去了解一下)export这个参数表示可不可以给其他的应用共享,这里要设置为false。

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

小结

调用系统相机的功能虽然不难,代码也不多,但是其中的零碎知识很多,零零散散,还是要注意的。特别是关于低高配的安卓版本问题还是要特别注意一下。

以上就是Android使用系统相机进行拍照的步骤的详细内容,更多关于Android 适用系统相机的资料请关注其它相关文章!


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文详细介绍了如何解决MyBatis中常见的BindingException错误,提供了多种排查和修复方法,确保Mapper接口与XML文件的正确配置。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
author-avatar
aatwo19668035
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有