权限:

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

1、android本地图片都是通过相册数据库获取对应数据

 private static final String[] IMAGES = {MediaStore.Images.Media.DATA,MediaStore.Images.Media.BUCKET_DISPLAY_NAME,MediaStore.Images.Media.MIME_TYPE,MediaStore.Images.Media.DATE_ADDED,MediaStore.Images.Media.LATITUDE,MediaStore.Images.Media.LONGITUDE,MediaStore.Images.Media.SIZE,MediaStore.Images.Media._ID};@WorkerThreadpublic void scanImageFile(Map<String, AlbumFolder> albumFolderMap, AlbumFolder allFileFolder) {ContentResolver contentResolver = mContext.getContentResolver();Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,IMAGES,null,null,null);if (cursor != null) {while (cursor.moveToNext()) {String path = cursor.getString(0);String folderName = cursor.getString(1);String mimeType = cursor.getString(2);long addDate = cursor.getLong(3);float latitude = cursor.getFloat(4);float longitude = cursor.getFloat(5);long size = cursor.getLong(6);String imageId = cursor.getString(7);//添加方法判断文件是否存在,如果不存在则不需要addif (path != null && new File(path).exists()) {AlbumFile imageFile = new AlbumFile();imageFile.setMediaType(AlbumFile.TYPE_IMAGE);imageFile.setPath(path);imageFile.setFolderName(folderName);imageFile.setMimeType(mimeType);imageFile.setAddDate(addDate);imageFile.setLatitude(latitude);imageFile.setLongitude(longitude);imageFile.setSize(size);//通过数据id,获取的图片对应uri
imageFile.setUri(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageId));allFileFolder.addAlbumFile(imageFile);AlbumFolder albumFolder = albumFolderMap.get(folderName);if (albumFolder != null)albumFolder.addAlbumFile(imageFile);else {albumFolder = new AlbumFolder();albumFolder.setName(folderName);albumFolder.addAlbumFile(imageFile);albumFolderMap.put(folderName, albumFolder);}}}cursor.close();}}

这里,我们需要注意,因为android10以后版本不能通过File来获取图片文件,所以我们需要通过Uri来讲图片文件转到沙箱文件中,来压缩等操作。

    /*** uri 转 File 兼容Android Q** @param context* @param uri* @return*/public static File fileByUri(Context context, Uri uri) {File file = null;if (androidQ()) {file = saveFileFromInputByAndroidBox(context, uri, fileSuffixName(filePathByUri(context, uri)));} else {file = new File(filePathByUri(context, uri));}return file;}/*** Android Q 保存uri文件到沙箱内** @param context* @param uri* @param suffixName* @return*/public static File saveFileFromInputByAndroidBox(Context context, Uri uri, String suffixName) {BufferedInputStream bis = null;FileOutputStream fos = null;BufferedOutputStream bos = null;File file = null;try {InputStream inputStream = context.getContentResolver().openInputStream(uri);file = createFilePathByBox(context, "file", randomName() + suffixName);bis = new BufferedInputStream(inputStream);fos = new FileOutputStream(file);if (fos != null) {bos = new BufferedOutputStream(fos);byte[] buf = new byte[BYTE];int bytes = bis.read(buf);while (bytes >= 0) {bos.write(buf, 0, bytes);bos.flush();bytes = bis.read(buf);}}} catch (Exception e) {e.printStackTrace();} finally {closeSilently(bis);closeSilently(bos);closeSilently(fos);}return file;}/*** 通过uri 获取文件真实路径 (AndroidQ以下版本)** @param context* @param uri* @return*/public static String filePathByUri(Context context, Uri uri) {String imagePath = null;if (context != null && uri != null) {String[] proj = {MediaStore.Images.Media.DATA};Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);if (cursor.moveToFirst()) {int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);imagePath = cursor.getString(column_index);}cursor.close();}return imagePath;}

如果是AndroidQ一下,其实我们再获取图片封装对象里面,就已经得到Path,可以直接使用。

2、视频   其实,视频跟图片获取逻辑也是一样,主要查询字段不一样来区分,获取视频还是图片

 /*** 视频*/private static final String[] VIDEOS = {MediaStore.Video.Media.DATA,MediaStore.Video.Media.BUCKET_DISPLAY_NAME,MediaStore.Video.Media.MIME_TYPE,MediaStore.Video.Media.DATE_ADDED,MediaStore.Video.Media.LATITUDE,MediaStore.Video.Media.LONGITUDE,MediaStore.Video.Media.SIZE,MediaStore.Video.Media.DURATION,MediaStore.Video.Media._ID};/*** 获取视频数据(按照全部、文件夹区分)** @param albumFolderMap 所有文件夹* @param allFileFolder  全部内容单独文件夹*/@WorkerThreadprivate void scanVideoFile(Map<String, AlbumFolder> albumFolderMap, AlbumFolder allFileFolder) {ContentResolver contentResolver = mContext.getContentResolver();Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,VIDEOS,null,null,null);if (cursor != null) {while (cursor.moveToNext()) {String path = cursor.getString(0);String folderName = cursor.getString(1);String mimeType = cursor.getString(2);long addDate = cursor.getLong(3);float latitude = cursor.getFloat(4);float longitude = cursor.getFloat(5);long size = cursor.getLong(6);long duration = cursor.getLong(7);long videoId = cursor.getLong(8);if (duration <= 0) {continue;}AlbumFile videoFile = new AlbumFile();videoFile.setMediaType(AlbumFile.TYPE_VIDEO);videoFile.setPath(path);videoFile.setFolderName(folderName);videoFile.setMimeType(mimeType);videoFile.setAddDate(addDate);videoFile.setLatitude(latitude);videoFile.setLongitude(longitude);videoFile.setSize(size);videoFile.setDuration(duration);videoFile.setDurationStr(AlbumUtils.convertDuration(duration));videoFile.setUri(Uri.withAppendedPath(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoId + ""));allFileFolder.addAlbumFile(videoFile);AlbumFolder albumFolder = albumFolderMap.get(folderName);if (albumFolder != null)albumFolder.addAlbumFile(videoFile);else {albumFolder = new AlbumFolder();albumFolder.setName(folderName);albumFolder.addAlbumFile(videoFile);albumFolderMap.put(folderName, albumFolder);}}cursor.close();}}

其实视频,我们会涉及到一个问题,就是封面展示的问题。

第一种:直接通过Gilde做展示

 Glide.with(getContext()).load(uri).into(imageView);

第二种:获取视频文件第一帧,作为封面(需要保存图片封面到本地)

第三种:获取数据库中视频的封面。

3.拍照

Uri uri = FileUtils.getImageUriByMediaStore(activity);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  //uri传递户自己生成
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
activity.startActivityForResult(intent, requestCode);

4.录像

Uri uri = FileUtils.getVideoUriByMediaStore(activity);
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // MediaStore.EXTRA_VIDEO_QUALITY 表示录制视频的质量,从 0-1,越大表示质量越好,同时视频也越大
//允许记录的最长时间(以 秒 为单位) 例如:限制为60S
//intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 60);
//允许的最大大小(以 B 为单位) 例如:限制大小为100M
//intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024L * 1024 * 100);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
activity.startActivityForResult(intent, requestCode);

Android获取本地相册中图片视频相关推荐

  1. Android获取本地相册图片

    Android获取本地相册图片 第一步设置静态权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_S ...

  2. 本地相册中图片水印如何去除【图片去水印工具】

    地址:本地相册中图片水印如何去除https://www.shuiyinyun.com/  照片去水印效果 操作步骤: 点击"立即下载"按钮,下载.安装并运行水印云: 点击首页的&q ...

  3. android从本地相册选择图片uri三星手机适配问题

    转载地址:http://blog.csdn.net/CathyChen0910/article/details/62456438 启动系统相册intent Intent intentFromGalle ...

  4. 获取IPhone相册中图片的方法(包括获取所有图片)

    获取iphone相册方法: 方法一: ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *gr ...

  5. 获取IPhone相册中图片的方法(ASSets)

    获取iphone相册方法: 方法一: ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *gr ...

  6. Android获取系统相册图片选中地址,获取手机中的所有图片地址自定义相册

    一.获取手机中的值 1.首先在使用读写sd卡权限 2.获取手机中的所有图片: 注意代码中的getGalleryPhotos(getContentResolver()) 方法获取所有地址 获取所有图片地 ...

  7. iOS 获取本地相册图片或视频

    1.先判断iOS 相机相册的权限检测 相关链接 https://www.jianshu.com/p/8a944534e0ee 2.iOS 获取本地相册图片 iOS 获取本地相册图片一 iOS 获取本地 ...

  8. android 获取MP4文件的图片大小

    今天,简单讲讲怎么获取MP4视频的每一帧的图片大小. android使用 MediaMetadataRetriever 获取视频文件的 总时长 和视频的分辨率. 根据该方式获取视频信息可以看出不仅仅可 ...

  9. Android 拍照以及相册中选择(适配高版本)————上传多张照片之压缩处理、在线预览可伸缩放大(二)

    ______ Introduction ______ 前言 上一篇文章刚给大家总结完,关于上传头像的功能.此文章所述 主要是关于上传头像的具体流程以及如何对照片做裁剪处理,回调给控件显示:当然重中之重 ...

最新文章

  1. IL 汇编学习笔记(三)
  2. SQLite学习手册(内存数据库)
  3. text/html与text/plain有什么区别?
  4. 两数之和 python_同一屏幕播放两个视频 视频左右两个画面或视频上下两个画面如何制作...
  5. MongoDB分布式集群分片
  6. 位运算求整数中二进制1的个数
  7. Sql Server 分区
  8. 数据库索引系列四:索引算法Hash与BTree的区别
  9. MySQL sql语句字段截取前几位,后几位等
  10. 雨林木风windows7旗舰版
  11. 宅霸java_宅霸游戏联机平台下载|宅霸游戏联机平台免费版下载 v4.5.0 官方版_小皮网...
  12. AHK实现DD驱动按键连发
  13. Linux Shell脚本教程(bash)
  14. 拔河比赛matlab编程,拔河比赛.doc
  15. 简单的水果价格排序(价格不重复)
  16. 62_LP-3DCNN: Unveiling Local Phase in 3D Convolutional Neural Networks 2019 论文笔记
  17. IT出路:跳出TCO,着眼TVO(总体拥有价值)
  18. 成就一亿技术人,我和CSDN的九年记忆
  19. 與古禪師談、求長生不老術
  20. 智慧城市背景下的“多规合一”标准探究

热门文章

  1. 【微课制作软件】Focusky教程 | 怎样改变图片形状?
  2. freemarker模板引擎,一篇文章看懂基本操作与进阶操作
  3. 网页彩票游戏代码html,H5彩票网站html代码
  4. 从工作10年中理解什么是高并发?
  5. 达梦HS搭建(DM-DM)_yxy
  6. zf2分析:Zend\ServiceManager
  7. 【5G之道】第十五章:动态TDD小基站增强
  8. 西门子PLC模拟量滤波程序,西门子1200和1500通用,有电压或者电流或者热电偶选择
  9. Acwing4261. 孤独的照片
  10. Ray Tracing From The Ground Up--Kevin Suffern--光线跟踪算法技术 [美]萨芬著 刘天慧译(清华大学出版社) 2011 英文原版+中文译版pdf