在访问相册的时候由于是跨进程访问相册资源,所以必须具备ContentProvider的基本知识,使用相机的时候需要指定照片存储位置,需要具备FileProvider的原理和使用

由于访问相册和使用相机,所以我们需要动态申请权限。使用easypermissions

implementation 'pub.devrel:easypermissions:0.3.0'

所需权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

1. 动态申请权限

private String[] permissions = {Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};if(EasyPermissions.hasPermissions(this,permissions)){}
else{EasyPermissions.requestPermissions(this,"访问相册权限",1,permissions);
}

使用easypermissions步骤
1.重写onRequestPermissionsResult,在内部调用EasyPermissions.onRequestPermissionsResult

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);EasyPermissions.onRequestPermissionsResult(requestCode,permissions,grantResults,this);}

2.使该类继承implements EasyPermissions.PermissionCallbacks,然后重写onPermissionsGrantedonPermissionsDenied进行授权判断

 @Overridepublic void onPermissionsGranted(int requestCode, List<String> perms) {Toast.makeText(this, "相关权限获取成功", Toast.LENGTH_SHORT).show();}@Overridepublic void onPermissionsDenied(int requestCode, List<String> perms) {Toast.makeText(this, "请同意相关权限,否则功能无法使用", Toast.LENGTH_SHORT).show();}

2. 打开相册并且获取选中的图片
打开相册:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,2);

获取选中图片

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if(requestCode == 2 &&resultCode == RESULT_OK){String imagePath = null;Uri uri = data.getData();if(DocumentsContract.isDocumentUri(MainActivity.this,uri)){String docId = DocumentsContract.getDocumentId(uri);if("com.android.providers.media.documents".equals(uri.getAuthority())) {String id=docId.split(":")[1];String 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())){imagePath = getImagePath(uri,null);}else if("file".equalsIgnoreCase(uri.getScheme())){imagePath = uri.getPath();}//展示选中的图片if(imagePath != null) {Intent intent = new Intent(MainActivity.this, PictureActivity.class);intent.putExtra("url", imagePath);startActivity(intent);}}}private String getImagePath(Uri uri,String selection) {String path = null;Cursor cursor = 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;}

3.使用相机拍照并且存储到指定文件
打开相机设定存储位置

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//用来打开相机的Intentif(takePhotoIntent.resolveActivity(getPackageManager())!=null){//这句作用是如果没有相机则该应用不会闪退,要是不加这句则当系统没有相机应用的时候该应用会闪退File imageFile = createImageFile();//创建用来保存照片的文件Uri ImageUri = null;if(imageFile!=null){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){/*7.0以上要通过FileProvider将File转化为Uri*/ImageUri = FileProvider.getUriForFile(this,"com.example.qsbk.fileProvider",imageFile);}else {/*7.0以下则直接使用Uri的fromFile方法将File转化为Uri*/ImageUri = Uri.fromFile(imageFile);}}//设置文件存储位置takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT,ImageUri);startActivityForResult(takePhotoIntent,3);//启动相机
}private File createImageFile() {String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());String imageFileName = "JPEG_"+timeStamp+"_";File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);File imageFile = null;try {imageFile = File.createTempFile(imageFileName,".jpg",storageDir);} catch (IOException e) {e.printStackTrace();}return imageFile;}

FileProvider的源码部分(这里不做讲解,具体请参考FileProvider的原理和使用:

<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.example.qsbk.fileProvider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>

file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths><!--代表的目录即为:Environment.getExternalStorageDirectory()/Android/data/包名/--><external-pathname="files_root"path="Android/data/com.example.qsbk/" /><!--代表的目录即为:Environment.getExternalStorageDirectory()--><external-pathname="external_storage_root"path="." /><!--代表的目录即为:Environment.getExternalStorageDirectory()/pics --><external-pathname="external"path="pics" /></paths>

知识拓展Intent.ACTION_PICK

(一)、调用图库,获取所有本地图片:

Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
imageIntent.setType("image/*");
startActivityForResult(imageIntent, PICK_CODE); //PICK_CODE是常量

(二)、调用本地联系人:

 Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); startActivityForResult(intent, PICK_CONTACT);

(三)、调用音乐,获取所有本地音乐文件:

Intent audioIntent = new Intent(Intent.ACTION_GET_CONTENT);
audioIntent.setType("audio/*");
startActivityForResult(audioIntent, PICK_AUDIO);

(四)、调用视频,获取所有本地视频文件:

Intent videoIntent = new Intent(Intent.ACTION_GET_CONTENT);
videoIntent.setType("video/*");
startActivityForResult(videoIntent, PICK_VIDEO);

参考博客:https://www.cnblogs.com/wucaiyun1/p/4933049.html

android访问相册、拍照相关推荐

  1. android头像相册/拍照选取,裁剪及上传综合案例

    在android项目中,很多情况下上传头像的需求,像qq,新浪微博,微信,飞信等很多应用都有这样的功能. 之前我写过的两篇文章:andorid下从相册选取/拍照选取一张相片并剪切和android下Bi ...

  2. Android 访问相册切换背景

    前言 Gilde框架用起来爽的不行,啊,pong友们可以百度了解.XIO习一下 初识图片加载框架--Glide的简单用法 前端代码 1.activity_main.xml <LinearLayo ...

  3. Android 调用相册 拍照 实现系统控件缩放 切割图片

    android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test;import java.io.By ...

  4. android 选择相册拍照图片 仿gridview九宫格 recycleview九宫格图片(可拖拽)

    九宫格图片(可拖拽) 自己项目用到的一个功能 实现九宫格显示图片 支持拍照和图库,可以拖拽排序.基本可以直接在项目使用 上图: [下载地址(CSDN竟然不能选择下载0资源积分)] 下载地址(githu ...

  5. android点击选择相册,android: 从相册中选择照片

    虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的. 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用.一个优秀 ...

  6. Android 7.0拍照/相册/截取图片FileProvider使用

    Android 7.0拍照/相册/截取图片FileProvider使用 Android 70拍照相册截取图片FileProvider使用 GitHub地址 HIT THE PIT 需求 实现解析 一 ...

  7. android 调用相册权限,采坑之Android手机访问相册权限问题

    问题描述 Android端APP 在6.0以上系统无法访问相册和拍照 经过 1.项目是一个后期接手的项目,在早期开发版本中没有注册相机权限,使用拍照时直接调用相机没有做相机权限检测,部分国产手机(小米 ...

  8. Android7.0调用系统相机拍照、访问相册问题。

    关于Android7.0调用系统相机拍照.访问相册的一些问题: 在Android6.0中Google提出了动态申请权限的Api,调用相机拍照,访问SDcard等操作都需要先申请对应的权限如下: < ...

  9. android 自定义相册选择,Android通过手机拍照或从本地相册选取图片设置头像

    像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1.让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2.让用户启动手机的相机拍照,拍完照片后裁剪 ...

最新文章

  1. 字节跳动的面试题.pdf
  2. flash程序员2012最大转变
  3. 3.3.1 差错控制(检错编码)
  4. hdu 1102 pku 2421 解题报告
  5. shell脚本触发java程序支持传参补跑 +crontab定时器_02
  6. mysql统计功能和数据库information_schema/performance_schema
  7. 用winform实现一个B/S代码更新打包工具
  8. Codeforces 837 简要题解
  9. Java——哈希值是什么?
  10. Windows下获取群CPU使用率的方法
  11. 访问服务器硬盘速度慢,硬盘读取速度变慢 当前传输模式pio的解决方法
  12. java 浮雕效果,制作逼真缝线牛皮文字效果的PS教程
  13. 2018年7月20日日报
  14. python图像主色调(主颜色)提取,在hsv空间k均值迭代实现
  15. RN 与android原生交互
  16. 剑魂之刃登录显示服务器异常,剑魂之刃8月1日服务器维护 维护补偿公告
  17. C语言中的0U或1U是什么意思?
  18. Java基础2 -- 判断语句
  19. 用java设计一个动物声音 模拟器,Java语言 设计一个动物声音“模拟器”(用接口实现)...
  20. 转码(BIN→ASCII/BIN→BCD)

热门文章

  1. 利用fastcoll实现MD5碰撞
  2. Android之解决360奇酷手机控制台打印全等级日志(默认只打印W、E等级日志)
  3. 牛客动态规划基础题单 1002 舔狗舔到最后一无所有
  4. 国内手机号码段,卫星电话号段
  5. 机械键盘的修理方法是什么
  6. 祛湿颗粒教你如何快速分辨与治疗湿邪
  7. 了解堡垒机价格与哪些方面有关,正确的进行选择
  8. 南昌市-中安协-安防工程企业设计施工维护能力评价
  9. 1.2 Git基本操作之提交文件到本地库
  10. iPhone新机定价史上最贵性能无亮点 华为这次稳赢要吊打苹果