android访问相册、拍照
在访问相册的时候由于是跨进程访问相册资源,所以必须具备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
,然后重写onPermissionsGranted
和onPermissionsDenied
进行授权判断
@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访问相册、拍照相关推荐
- android头像相册/拍照选取,裁剪及上传综合案例
在android项目中,很多情况下上传头像的需求,像qq,新浪微博,微信,飞信等很多应用都有这样的功能. 之前我写过的两篇文章:andorid下从相册选取/拍照选取一张相片并剪切和android下Bi ...
- Android 访问相册切换背景
前言 Gilde框架用起来爽的不行,啊,pong友们可以百度了解.XIO习一下 初识图片加载框架--Glide的简单用法 前端代码 1.activity_main.xml <LinearLayo ...
- Android 调用相册 拍照 实现系统控件缩放 切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test;import java.io.By ...
- android 选择相册拍照图片 仿gridview九宫格 recycleview九宫格图片(可拖拽)
九宫格图片(可拖拽) 自己项目用到的一个功能 实现九宫格显示图片 支持拍照和图库,可以拖拽排序.基本可以直接在项目使用 上图: [下载地址(CSDN竟然不能选择下载0资源积分)] 下载地址(githu ...
- android点击选择相册,android: 从相册中选择照片
虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的. 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用.一个优秀 ...
- Android 7.0拍照/相册/截取图片FileProvider使用
Android 7.0拍照/相册/截取图片FileProvider使用 Android 70拍照相册截取图片FileProvider使用 GitHub地址 HIT THE PIT 需求 实现解析 一 ...
- android 调用相册权限,采坑之Android手机访问相册权限问题
问题描述 Android端APP 在6.0以上系统无法访问相册和拍照 经过 1.项目是一个后期接手的项目,在早期开发版本中没有注册相机权限,使用拍照时直接调用相机没有做相机权限检测,部分国产手机(小米 ...
- Android7.0调用系统相机拍照、访问相册问题。
关于Android7.0调用系统相机拍照.访问相册的一些问题: 在Android6.0中Google提出了动态申请权限的Api,调用相机拍照,访问SDcard等操作都需要先申请对应的权限如下: < ...
- android 自定义相册选择,Android通过手机拍照或从本地相册选取图片设置头像
像微信.QQ.微博等社交类的APP,通常都有设置头像的功能,设置头像通常有两种方式: 1.让用户通过选择本地相册之类的图片库中已有的图像,裁剪后作为头像. 2.让用户启动手机的相机拍照,拍完照片后裁剪 ...
最新文章
- 字节跳动的面试题.pdf
- flash程序员2012最大转变
- 3.3.1 差错控制(检错编码)
- hdu 1102 pku 2421 解题报告
- shell脚本触发java程序支持传参补跑 +crontab定时器_02
- mysql统计功能和数据库information_schema/performance_schema
- 用winform实现一个B/S代码更新打包工具
- Codeforces 837 简要题解
- Java——哈希值是什么?
- Windows下获取群CPU使用率的方法
- 访问服务器硬盘速度慢,硬盘读取速度变慢 当前传输模式pio的解决方法
- java 浮雕效果,制作逼真缝线牛皮文字效果的PS教程
- 2018年7月20日日报
- python图像主色调(主颜色)提取,在hsv空间k均值迭代实现
- RN 与android原生交互
- 剑魂之刃登录显示服务器异常,剑魂之刃8月1日服务器维护 维护补偿公告
- C语言中的0U或1U是什么意思?
- Java基础2 -- 判断语句
- 用java设计一个动物声音 模拟器,Java语言 设计一个动物声音“模拟器”(用接口实现)...
- 转码(BIN→ASCII/BIN→BCD)