对于外部存储中,APP私有目录下的图片或者视频,一般情况下,系统自带相册中是不会显示的,如果想要将其显示出来,可以通过下面的方法,对于适配Android 10的分区存储也是很方便的一种选择。

Android中的存储简单展示如下:这里说的APP私有目录,也就是指最下面部分。

下面是具体的方法

一、辅助工具类

package com.jlpay.partner.utils;import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.Log;import java.io.File;public class AlbumNotifyHelper {public static final String TAG = AlbumNotifyHelper.class.getSimpleName();///// 下面是对外公开的重载的方法///public static void notifyScanDcim(Context context, String filePath) {scanFile(context, filePath);}public static void insertVideoToMediaStore(Context context, String filePath, long dateTaken, long duration) {insertVideoToMediaStore(context, filePath, dateTaken, 0, 0, duration);}public static void insertImageToMediaStore(Context context, String filePath, long createTime) {insertImageToMediaStore(context, filePath, createTime, 0, 0);}///// 扫描系统相册核心方法////*** 针对系统文件夹只需要扫描,不用插入内容提供者,不然会重复** @param context  上下文* @param filePath 文件路径*/public static void scanFile(Context context, String filePath) {if (!checkFile(filePath)) {return;}Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);intent.setData(Uri.fromFile(new File(filePath)));context.sendBroadcast(intent);}///// 非系统相册向MediaContent中插入数据,核心方法////*** 针对非系统文件夹下的文件,使用该方法* 插入时初始化公共字段** @param filePath 文件* @param time     ms* @return ContentValues*/private static ContentValues initCommonContentValues(String filePath, long time) {ContentValues values = new ContentValues();File saveFile = new File(filePath);long timeMillis = getTimeWrap(time);values.put(MediaStore.MediaColumns.TITLE, saveFile.getName());values.put(MediaStore.MediaColumns.DISPLAY_NAME, saveFile.getName());values.put(MediaStore.MediaColumns.DATE_MODIFIED, timeMillis);values.put(MediaStore.MediaColumns.DATE_ADDED, timeMillis);values.put(MediaStore.MediaColumns.DATA, saveFile.getAbsolutePath());values.put(MediaStore.MediaColumns.SIZE, saveFile.length());return values;}/*** 保存到照片到本地,并插入MediaStore以保证相册可以查看到,这是更优化的方法,防止读取的照片获取不到宽高** @param context    上下文* @param filePath   文件路径* @param createTime 创建时间 <=0时为当前时间 ms* @param width      宽度* @param height     高度*/public static void insertImageToMediaStore(Context context, String filePath, long createTime, int width, int height) {if (!checkFile(filePath))return;createTime = getTimeWrap(createTime);ContentValues values = initCommonContentValues(filePath, createTime);values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, createTime);values.put(MediaStore.Images.ImageColumns.ORIENTATION, 0);values.put(MediaStore.Images.ImageColumns.ORIENTATION, 0);if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {if (width > 0) values.put(MediaStore.Images.ImageColumns.WIDTH, 0);if (height > 0) values.put(MediaStore.Images.ImageColumns.HEIGHT, 0);}values.put(MediaStore.MediaColumns.MIME_TYPE, getPhotoMimeType(filePath));context.getApplicationContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);}/*** 保存到视频到本地,并插入MediaStore以保证相册可以查看到,这是更优化的方法,防止读取的视频获取不到宽高** @param context    上下文* @param filePath   文件路径* @param createTime 创建时间 <=0时为当前时间 ms* @param duration   视频长度 ms* @param width      宽度* @param height     高度*/public static void insertVideoToMediaStore(Context context, String filePath, long createTime, int width, int height, long duration) {if (!checkFile(filePath))return;createTime = getTimeWrap(createTime);ContentValues values = initCommonContentValues(filePath, createTime);values.put(MediaStore.Video.VideoColumns.DATE_TAKEN, createTime);if (duration > 0)values.put(MediaStore.Video.VideoColumns.DURATION, duration);if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {if (width > 0) values.put(MediaStore.Video.VideoColumns.WIDTH, width);if (height > 0) values.put(MediaStore.Video.VideoColumns.HEIGHT, height);}values.put(MediaStore.MediaColumns.MIME_TYPE, getVideoMimeType(filePath));context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);}/*** 是不是系统相册** @param path* @return*/private static boolean isSystemDcim(String path) {return path.toLowerCase().contains("dcim") || path.toLowerCase().contains("camera");}/*** 获取照片的mine_type** @param path* @return*/private static String getPhotoMimeType(String path) {String lowerPath = path.toLowerCase();if (lowerPath.endsWith("jpg") || lowerPath.endsWith("jpeg")) {return "image/jpeg";} else if (lowerPath.endsWith("png")) {return "image/png";} else if (lowerPath.endsWith("gif")) {return "image/gif";}return "image/jpeg";}/*** 获取video的mine_type,暂时只支持mp4,3gp** @param path* @return*/private static String getVideoMimeType(String path) {String lowerPath = path.toLowerCase();if (lowerPath.endsWith("mp4") || lowerPath.endsWith("mpeg4")) {return "video/mp4";} else if (lowerPath.endsWith("3gp")) {return "video/3gp";}return "video/mp4";}/*** 获得转化后的时间** @param time* @return*/private static long getTimeWrap(long time) {if (time <= 0) {return System.currentTimeMillis();}return time;}/*** 检测文件存在** @param filePath* @return*/private static boolean checkFile(String filePath) {//boolean result = FileUtil.fileIsExist(filePath);boolean result = false;File mFile = new File(filePath);if (mFile.exists()) {result = true;}Log.e(TAG, "文件不存在 path = " + filePath);return result;}
}

二、测试用例

private void demo() {ArrayList<String> mListPathSysImg = new ArrayList<>();if (mListPathSysImg.size() != 0) {//下载成功,刷新系统图库  视频部分手机不支持显示for (int i = 0; i < mListPathSysImg.size(); i++) {String nDownLoadPath = mListPathSysImg.get(i);String updateImgPath = FileUtil.getDownLoad() + nDownLoadPath.substring(nDownLoadPath.lastIndexOf("/"));if (updateImgPath.contains(".LRV")) {updateImgPath = updateImgPath.replace(".LRV", ".MP4");AlbumNotifyHelper.insertVideoToMediaStore(this, updateImgPath, 0, 5000);} else {AlbumNotifyHelper.insertImageToMediaStore(this, updateImgPath, 0);}//Log.e("nDownLoadPath----more-->","nDownLoadPath="+nDownLoadPath+",updateImgPath="+updateImgPath);}mListPathSysImg.clear();}}

Android 外部存储App私有目录下照片和视频显示到相册相关推荐

  1. Android内部存储与外部存储(私有目录与公共目录)图文详解

    目录 一.存储空间概述 二.存储空间的划分 1.存储划分 2.内部存储 2.1 内部存储概述 2.2 内部存储 - 私有目录 3. 外部存储 3.1 外部存储概述 3.2 外部存储 - 私有目录 3. ...

  2. Android 下载到APP私有目录的图片和视频同步到手机图库相册

    //下载到本地私有目录的代码省略 if (file.getAbsolutePath().contains("MP4")) {copyFileToGallery(file, file ...

  3. android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...

    首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...

  4. android 拷贝文件到其他目录下

    今天,讲讲如何拷贝文件到指定目录下. 一,简单的使用输入流进行拷贝. /** * 复制单个文件 * @param oldPath String 原文件路径 如:c:/fqf.txt * @param ...

  5. android 存储私有文件,是否可以只在Android应用程序的私有目录中保存图像,而不是设备的内部或任何外部存储?...

    我不想将我的Android应用程序图像存储在内部或外部设备存储中,这样它将对库可见. 现在,我正在外部设备存储中保存我的应用程序图像.但是我想把图像保存到应用程序的私有目录中.我怎样才能做到这一点? ...

  6. android 缓存文件目录在哪个文件夹里,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...

    先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...

  7. android 根目录缓存,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...

    先简要介绍一下Android系统的文件系统吧,本文基于原生Android M系统: 我们都知道Android系统内核就是个Linux.所以我们的文件系统与Linux也是基本一致的,最顶部的目录是 &q ...

  8. android 外部存储列表,如何获取Android设备的已安装外部存储列表

    我使用/ proc / mounts文件来获取可用存储选项的列表 public class StorageUtils { private static final String TAG = " ...

  9. Android 获取SDCard中某个目录下图片

    本文介绍Android开发中如何获取SDCard中某目录下的所有图片并显示出来,下面的我们提供的这个函数是通用的,只要提供路径就可以查询出该目录下所有图片的路径信息,并保存到一个List<Str ...

最新文章

  1. maven的pom.xml中repositories的作用
  2. opencl获取gpu信息_如果在尝试获取OpenCL gpu设备类型时,Char *语句出现问题
  3. dojo Quick Start/dojo入门手册--面向对象,定义Class
  4. 将switch case转为条件驱动
  5. ES6-使用 super 关键字访问原型对象
  6. linux如何安装django
  7. 那些月薪过万的程序员都是从什么时间开始的?
  8. 强悍的Google Earth
  9. 在树莓派上搭建gitea
  10. TypeError: can‘t convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory fi
  11. python判断中文函数_如何判断(或如何编写)一个没有副作用的python函数?
  12. 电子元器件识别(图解)
  13. IP协议详解【IP报文头部结构、IP分片、IP路由、IP转发】
  14. 13. 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值5钱,一只母鸡值3钱,三只小鸡值1钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
  15. 零基础小白python入门——深入Python中的文件操作
  16. Topic 15. 临床预测模型之决策曲线 (DCA)
  17. slim android7 nexus7,新Nexus 7详细拆解:拆装不难,外壳脆弱
  18. Windows-驱动-解决Thinkpad e470c在Win8.1下WiFi无法连接的问题
  19. git branch -D 大写的D 删除分支
  20. 论文毕业设计答辩总结

热门文章

  1. 完全图与强连通图的那些坑
  2. 稀缺性原则适用于软件产品
  3. 最近在做的用户留存分析,和几种方法。
  4. 彻底理解PCA(Principal Component Analysis)主成分分析
  5. .NET CoreRT AOT原生程序编译使用的一些小建议
  6. python练习(4)
  7. 苹果推出iOS15.2正式版,“数字遗产”计划正式上线,你的“继承人”是谁?
  8. 求职真的是欲哭无泪,520,521还要继续找工作
  9. 万马齐喑究可哀-中文编程的又一波quot;讨论quot;
  10. 英语Aeroides海蓝宝石aeroides单词