安卓调用系统相机进行拍照

调用系统相机进行拍照的话,步骤比较简单,分为两步

  • 使用隐式Intent打开相机
  • 在onActivityResult回调中对图片进行处理 (传回来的图片分为缩略图和原图,缩略图比较小可以直接进行展示,原图比较大,需要传输到文件中显示)
    拍照获取缩略图
<ImageViewandroid:layout_width="200dp"android:layout_height="200dp"android:layout_centerInParent="true"android:id="@+id/image" />
private static final int REQ_CODE = 1;private void takePhone(){Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if(intent.resolveActivity(getPackageManager())!=null){//这句作用是如果没有相机则该应用不会闪退,要是不加这句则当系统没有相机应用的时候该应用会闪退Log.e(TAG, "onClick: 手机有拍照功能" );startActivityForResult(intent,REQ_CODE);//启动相机}
}@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQ_CODE && resultCode == RESULT_OK){Log.e(TAG, "onActivityResult: jinru" );Bundle extras = data.getExtras();Bitmap data1 = (Bitmap) extras.get("data");addressImage.setImageBitmap(data1);Log.e(TAG, "onActivityResult: data"+data1.toString() );}
}

拍照获取原图

  1. 先在清单文件applicaion当中配置
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application><providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.example.ceshiapplication.fileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"></meta-data></provider>
</application>
  1. xml布局 file_paths.xml
<paths><external-pathname="my_images"path="."/>
</paths>

3.Java代码

private static final int REQUEST_TAKE_PHOTO_CODE = 2;
private static final String FILE_PROVIDER_AUTHORITY = "com.example.ceshiapplication.fileProvider";
private Uri imageUri;private void takePhoto() {//拍照并获取大图  图片存入相册Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if (intent.resolveActivity(getPackageManager()) != null) {File imageFile = createImageFile();//创建用来保存图片的文件Log.e(TAG, "takePhoto: imageFile" + imageFile);if (imageFile != null) {if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//7.0以上需要通过FileProvider将file转换成uriimageUri = FileProvider.getUriForFile(this, FILE_PROVIDER_AUTHORITY, imageFile);} else {imageUri = Uri.fromFile(imageFile);}}intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intent, REQUEST_TAKE_PHOTO_CODE);}}private File createImageFile() {String format = new SimpleDateFormat("yyyy-MM-DD").format(new Date());String fileName = "JDEG_" + format + "_";File file = getExternalFilesDir(Environment.DIRECTORY_PICTURES);try {File imageFile = File.createTempFile(fileName, ".jpg", file);return imageFile;} catch (IOException e) {e.printStackTrace();}return null;
}@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_TAKE_PHOTO_CODE && resultCode == RESULT_OK) {try {Bitmap bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(imageUri));addressImage.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}
}

打开相册获取图片

步骤和打开相机差不多 都是使用隐式Intent

private static final int CHOOSE_PHONE = 3;private void openAlbum() {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("image/*");startActivityForResult(intent,CHOOSE_PHONE);
}@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == CHOOSE_PHONE && resultCode == RESULT_OK){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){displayPicture(data);//4.4之后图片解析}else {lowVersionDisplayPicture(data);//4.4之前图片解析}}
}/*** 4.4版本以下对返回的图片Uri的处理:* 就是从返回的Intent中取出图片Uri,直接显示就好* @param data 调用系统相册之后返回的Uri*/
private void lowVersionDisplayPicture(Intent data) {Uri uri = data.getData();String imagePath = getImagePath(uri,null);displayImage(imagePath);
}/*** 4.4版本以上对返回的图片Uri的处理:* 返回的Uri是经过封装的,要进行处理才能得到真实路径* @param data 调用系统相册之后返回的Uri*/@TargetApi(19)private void displayPicture(Intent data) {String imagePath = null;Uri uri = data.getData();if (DocumentsContract.isDocumentUri(getActivity(), uri)) {//如果是document类型的Uri,则提供document id处理String docId = DocumentsContract.getDocumentId(uri);if ("com.android.providers.media.documents".equals(uri.getAuthority())) {String id = docId.split(":")[1];//解析出数字格式的idString selection = MediaStore.Images.Media._ID + "=" + id;imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));imagePath = getImagePath(contentUri, null);}} else if ("content".equalsIgnoreCase(uri.getScheme())) {//如果是content类型的uri,则进行普通处理imagePath = getImagePath(uri, null);} else if ("file".equalsIgnoreCase(uri.getScheme())) {//如果是file类型的uri,则直接获取路径imagePath = uri.getPath();}displayImage(imagePath);}/*** 将imagePath指定的图片显示到ImageView上*/private void displayImage(String imagePath) {if (imagePath != null) {Bitmap bitmap = BitmapFactory.decodeFile(imagePath);addressImage.setImageBitmap(bitmap);} else {Toast.makeText(getActivity(), "failed to get image", Toast.LENGTH_SHORT).show();}}/*** 将Uri转化为路径* @param uri 要转化的Uri* @param selection 4.4之后需要解析Uri,因此需要该参数* @return 转化之后的路径*/private String getImagePath(Uri uri, String selection) {String path = null;Cursor cursor = getActivity().getContentResolver().query(uri, null, selection, null, null);if (cursor != null) {if (cursor.moveToFirst()) {path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}cursor.close();}return path;}

安卓调用系统相机进行拍照相关推荐

  1. 安卓调用系统相机拍照并返回,实现图片预览

    安卓调用相机拍照并返回预览及相关类型换(略缩图,画质糊)原图预览参考传送门 一.demo预览 二.xml代码和activity简单代码描述. 三.顺便写几个转换工具方法吧 今年主要在忙新项目,安卓也有 ...

  2. 安卓调用系统相机录像并上传到后端服务器

    安卓调用系统相机录像并上传到后端服务器 写在前面 一.录像上传的思路 二.添加相关权限 三.按钮设置监听,调用相机录像并回调 1.按钮设置监听: 2.调用代码 3.回调代码(划重点奥) 最后的最后: ...

  3. android 实现自动拍照,Android:调用系统相机实现拍照+裁切(兼容7.0以上系统)

    android.jpg 前言 在平时的工作中,我们会经常遇到这样的需求:比如更改用户头像,我们就需要打开相机或相册,选择照片后进行裁剪,最后上传给后台... 相信这样的功能对小伙伴们来说可能早已司空见 ...

  4. android调用系统相机实现拍照功能

    在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没有做过东西,这次也是临时决定让我做一个 ...

  5. Android 调用系统相机,拍照,并上传图片所注意的一些问题

    其实android拍照这个地方还是有很多注意事项的,我在上个项目中就遇到一些坑,因此我想把它记录下来,希望能帮助一些跟我遇到的同样的问题的人 如果你在项目中遇到以下问题: 通过系统路径,拍出来的图片不 ...

  6. 安卓调用系统相机拍照并且显示在ImageView上

    并没有什么技术难点,只是在保存到sdCard的时候有一点小细节需要注意,所以写了这篇文章.代码很简单,就不解释什么了,直接贴上源码. public class TakePhotoActivity ex ...

  7. Android学习之调用系统相机实现拍照功能

    一.今天,来介绍如何调用系统自带的相机进行拍照,主要有以下2种实现的方式: 1.Camera应用程序包含了一个意图过滤器,即intent filter,它使得开发人员能够提供与Camera应用程序同等 ...

  8. android 调用 系统 相机 摄像机 拍照 拍视频

    主要内容如下: 系统现有相机应用的调用 系统现有相机拍摄照片 获取系统现有相机拍摄的图片 系统现有相机拍摄图片Demo 系统现有相机拍摄视频 系统现有相机拍摄视频Demo 系统现有相机应用的调用 对于 ...

  9. 安卓调用系统相机三步走

    第一步: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> &l ...

最新文章

  1. python 统计一个列表中每个值的出现次数
  2. PMCAFF | 一个CRM产品大神的产品之路
  3. Android dp转px,sp转px
  4. [并查集][排序][dfs][启发式合并] JZOJ P3635 Peaks
  5. 张泉灵:时代抛弃你时,连一声再见都不会说
  6. PHP获取git提交信意_代码提交规范检查与修复 php_codesniffer + composer-git-hooks
  7. 31个实用find命令的案例
  8. 彼得林奇的成功投资四-投资组合股市大跌时表现
  9. 关于Servlet的两种配置Web.xml文件配置或者使用(@WebServlet(name = ,urlPatterns = ))配置问题——WebServlet注解
  10. 设计模式是什么鬼(抽象工厂)
  11. PHPMYSQL物联网监控系统Web端
  12. 中国液晶面板王者为何被小弟超越了?
  13. PMP学习笔记:采购合同类型
  14. 400分理科学计算机,400分左右的理科大学 高考400分能上什么学校
  15. 用iOS模拟器安装App
  16. 考研二阶常系数非齐次微分方程式特解(微分算子法)
  17. linux修改文件元信息,Linux 文件元数据详细讲解
  18. Week 12 Homework
  19. 杭州一公司开20万月薪抢AIGC算法工程师;SpaceX「星舰」发射任务失败;华为宣布实现ERP自主可控,突破封锁|极客头条...
  20. NLP 2020顶会论文汇总,今天你读了吗?

热门文章

  1. AD17之原理图层次设计
  2. Reids简直存储,key以“\xAC\xED\x00\x05t\x00“开头
  3. java连接数据库用户 'sa' 登录失败。 ClientConnectionId:解决方法
  4. PHP母亲节,用PS设计感恩母亲节字体海报的教程
  5. java 爬取评论,Java基于WebMagic爬取某豆瓣电影评论的实现
  6. 瑞友云电脑与政府行业
  7. SystemVerilog: 打印显示之数据格式控制及特殊字符详解
  8. c语言关掉编译优化,C/C++代码被 VS 2010 优化掉了,如何关闭优化?
  9. 麻烦你先搞懂这几个问题,简历再写熟悉数据库!!!
  10. oracle外建什么作用,列举在数据库中外键的好处以及优劣