文章目录 一、动态权限申请 二、MediaStore 操作文件 三、完整代码示例 1、MainActivity 核心代码 2、build.gradle 构建脚本 3、清单文件 五、相关文档资料 特别注意 操作文件 ---- 在 Android 11 之后 , 不能使用 File 进行文件操作 , 需要使用 MediaStore 进行文件操作 , MediaStore 的如下内部类 Files , 下的 Images 内部类 , 负责 Pictures 下的文件操作 ; package android.provider; public final class MediaStore { }/hello") // 设置文件名称 contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "hello.txt") }/hello") // 设置文件名称 contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "hello.txt")
MediaStore,本质上是 Android 维护的一个文件系统的数据库,它记录了当前磁盘上所有的文件索引,我们可以通过它,快速的查找当前系统的文件。 MediaStore 刷新的时机是不一定的,也就是说,保存、删除、重命名 的一张图片文件,MediaStore 并不会立即刷新文件系统,将此文件索引记录下来。 而系统本身是存在一些自动刷新 MediaStore 的时机,例如:重启手机。 表现就是,当你保存了一张图片到本地文件夹中之后,通过文件管理器类的 App,可以在目录下找到这涨照片,但是在系统相册中,是无法立即看到它的, 所以在我们保存、删除、操作文件之后,去触发系统刷新 MediaStore 刷新删除的文件 notifyLocalMedia(file.getPath()); //通知MediaStore刷新重命名的文件 updateGallery(f2.getPath()); 删除文件 for
MediaStore API 新增的方法 ? 系统在调用以上任何一个方法后,会构建一个 PendingIntent 对象。 性能:通过 File () 等直接通过路径访问的 API 实际上也会映射为MediaStore API 。 媒体集 1) 查询媒体集(需要 READ_EXTERNAL_STORAGE 权限) 实际上 MediaStore 是以前就有的 API ,不同的是过去主要通过 MediaStore.Video.Media _ID, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.SIZE { put(MediaStore.Audio.Media.DISPLAY_NAME, "My Workout Playlist.mp3") put(MediaStore.Audio.Media.IS_PENDING
文章目录 一、报错信息 二、解决方案 Android 低版本系统中不能使用分区存储方式管理文件 ; 一、报错信息 ---- 在 Android 9 版本中使用 MediaStore 进行分区存储 ; // 设置插入 external.db 数据库中的 files 数据表的各个字段的值 // 设置存储路径 , files 数据表中的对应 relative_path 字段在 MediaStore 中以常量形式定义 contentValues.put(MediaStore.Downloads.RELATIVE_PATH, "${Environment.DIRECTORY_DOWNLOADS }/hello") // 设置文件名称 contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "hello.txt") // 设置文件标题, 一般是删除后缀, 可以不设置 contentValues.put(MediaStore.Downloads.TITLE, "hello")
340); intent.putExtra("outputY", 340); //将URI指向相应的file:///… intent.putExtra(MediaStore.EXTRA_OUTPUT , selectionArgs); } } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore This is useful for * MediaStore Uris, and other file-based ContentProviders. , selectionArgs); } } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore This is useful for * MediaStore Uris, and other file-based ContentProviders.
文章目录 一、分区存储模式下使用 MediaStore 插入图片 二、分区存储模式下使用 MediaStore 查询图片 三、相关文档资料 Android 分区存储系列博客 : 【Android 文件管理 文件操作 ) 一、分区存储模式下使用 MediaStore 插入图片 ---- 在上一篇博客 【Android 文件管理】分区存储 ( MediaStore 文件操作 ) 中 , 创建了一个文本文件 其次 , 构造插入数据库的 ContentValues 数据结构 , 设置的 “external.db” 数据库中的 “files” 数据表的各个字段与 MediaStore 中的常量对应关系如下 : MediaStore.Downloads.RELATIVE_PATH : relative_path MediaStore.Downloads.DISPLAY_NAME : display_ame MediaStore.Downloads.TITLE contentValues.put(MediaStore.Downloads.TITLE, "image") // 设置 MIME_TYPE contentValues.put(MediaStore.Downloads.MIME_TYPE
文章目录 一、分区存储模式下使用 MediaStore 修改图片 二、分区存储模式下使用 MediaStore 删除图片 三、相关文档资料 Android 分区存储系列博客 : 【Android 文件管理 应用可访问的存储空间 ( 存储空间分类 | 存储空间访问权限 | 分区存储 ) 【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 ) 【Android 文件管理】分区存储 ( MediaStore MediaStore 修改图片 ---- 将 /sdcard/Pictures/image/ 目录下的 image.jpg 修改为 image_update.jpg ; 分区存储机制中 , 删除图片文件 , 不能通过获取其绝对路径进行删除 , 必须先使用 MediaStore 查询到图片文件的 Uri , 然后通过 Uri 执行 删除 / 修改 图片文件的操作 ; 查询图片 : 查询图片文件的具体原理参考 , // 指定要查询的列 null, // 指定查询语句 "${MediaStore.Images.Media.DISPLAY_NAME}
(MediaStore.MediaColumns.SIZE, 215454); values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); values.put(MediaStore.Audio.Media.ARTIST, "Madonna"); values.put(MediaStore.Audio.Media.DURATION , 230); values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(MediaStore.Audio.Media.IS_NOTIFICATION , false); values.put(MediaStore.Audio.Media.IS_ALARM, false); values.put(MediaStore.Audio.Media.IS_MUSIC , false); //Insert it into the databaseUri Uri uri = MediaStore.Audio.Media.getContentUriForPath(
访问公共目录 MediaStore Uri和路径对应表 Uri-path.png MediaStore提供下列Uri,可以用MediaProvider查询对应的Uri数据。 解决方法1: 参见使用MediaStore访问公共目录和使用SAF选择单个文件,使用MediaStore接口访问公共目录中的多媒体文件,或者使用 SAF访问公共目录中的任意文件。 问题原因2: 使用MediaStore接口访问非多媒体文件。 问题分析2: 在Android Q上,使用MediaStore接口只能访问公共目录中的多媒体文件。 解决方案: APP应该将想要保留的文件通过MediaStore接口保存到公共目录下,请参见使用MediaStore访问公共目录。 MediaStore 文件增加Pending状态 AndroidQ上,MediaStore中添加MediaStore.Images.Media.IS_PENDING ,flag用来表示文件的Pending
_ID, MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME , MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN, MediaStore.Images.Media.ORIENTATION, MediaStore.Images.Thumbnails.DATA }; , "", null, MediaStore.Images.Media.DATE_TAKEN + " DESC");//按时间倒序获取图片 int bucketNameColumn = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);//获得图片目录名称在
()) { String path = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));// )); // 作者 long size = c.getLong(c.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));// int time = c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media. , null, MediaStore.Images.Media.MIME_TYPE + "= ? or " + MediaStore.Images.Media.MIME_TYPE + "= ?"
答案是可以的,sdk还提供了这样一个方法: MediaStore.Images.Media.insertImage(getContentResolver(), "image path", "title" values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, mImageFileName); values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, mImageTime); values.put(MediaStore.Images.ImageColumns.DATE_ADDED , dateSeconds); values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, dateSeconds); (MediaStore.Images.ImageColumns.WIDTH, mImageWidth); values.put(MediaStore.Images.ImageColumns.HEIGHT
解决方法 1:使用 MediaStore 接口访问公共目录中的多媒体文件,或者使用 SAF 访问公共目录中的任意文件。 注意:从 MediaStore 接口中查询到的 DATA 字段将在 Android Q 开始废弃,不应该利用它来访问文件或者判断文件是否存在;从 MediaStore 接口或者 SAF 获取到文件 Uri 问题原因 2:使用 MediaStore 接口访问非多媒体文件。 问题分析 2:在 Android Q 上,使用 MediaStore 接口只能访问公共目录中的多媒体文件。 解决方案:APP 应该将想要保留的文件通过 MediaStore 接口保存到公共目录下。 在 Fota 升级前,可以将 APP 的用户历史数据通过 MediaStore 接口迁移到公共目录下。
getVideoCaptureDurationLimit(); //SystemProperties.getInt("ro.media.enc.lprof.duration", 60); Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE ); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT , sizeLimit); intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, durationLimit); startActivityForResult startActivityForResult(intent, requestCode); //拍照 REQUEST_CODE_TAKE_PICTURE 为返回的标识 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE ); //"android.media.action.IMAGE_CAPTURE"; intent.putExtra(MediaStore.EXTRA_OUTPUT, Mms.ScrapSpace.CONTENT_URI
MediaStore类包含四个内部类,分别是:MediaStore.Audio(存放音频信息),MediaStore.Files(存放文件信息,包含非媒体文件,如txt,PDF),MediaStore.Image MediaStore中audio的字段定义错误的是 您的回答为:歌曲的名称 :MediaStore.Audio.Media.TITL ()歌曲的名称:MediaStore.Audio.Media.TITL ()歌曲的专辑名:MediaStore.Audio.Media.ALBUM ()歌曲的歌手名:MediaStore.Audio.Media.ARTIST ()歌曲文件的全路径:MediaStore.Audio.Media.DATA ()歌曲文件的名称:MediaStore.Audio.Media.DISPLAY_NAME ()歌曲文件的发行日期:MediaStore.Audio.Media.YEAR ()歌曲的总播放时长: MediaStore.Audio.Media.DURATION ()歌曲文件的大小:MediaStore.Audio.Media.SIZE 4.
, MediaStore.Images.ImageColumns.DATE\_ADDED, MediaStore.Images.ImageColumns.WIDTH, MediaStore.Images.ImageColumns.HEIGHT ,)Android 10以下val MEDIA\_PROJECTIONS = arrayOf( MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DATE : -1 val dateAddedIndex = getColumnIndex(MediaStore.Images.ImageColumns.DATE\_ADDED) ? : -1 val widthIndex = getColumnIndex(MediaStore.Images.ImageColumns.WIDTH) ? : -1 val heightIndex = getColumnIndex(MediaStore.Images.ImageColumns.HEIGHT) ?
get the the path for Storage Access * Framework Documents, as well as the _data field for the MediaStore ; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI ; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore This is useful for * MediaStore Uris, and other file-based ContentProviders.
dh" values.put(MediaStore.MediaColumns.DISPLAY_NAME, mImageFileName); values.put(MediaStore.MediaColumns.MIME_TYPE (MediaStore.MediaColumns.DATE_MODIFIED, mImageTime / 1000); values.put(MediaStore.MediaColumns.DATE_EXPIRES , (mImageTime + DateUtils.DAY_IN_MILLIS) / 1000); values.put(MediaStore.MediaColumns.IS_PENDING values.clear(); values.put(MediaStore.MediaColumns.IS_PENDING, 0); values.putNull (MediaStore.MediaColumns.DATE_EXPIRES); resolver.update(uri, values, null, null);
); // MediaStore.EXTRA_VIDEO_QUALITY 表示录制视频的质量,从 0-1,越大表示质量越好,同时视频也越大 intent.putExtra (MediaStore.EXTRA_VIDEO_QUALITY, 0); intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30); MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们可以得到各种需要的信息。 MediaStore.Audio获取音频信息的类 MediaStore.Images获取图片信息 MediaStore.Video获取视频信息 为什么是错误示范呢? 因为 getContentResolver().query(photoUri, new String[]{MediaStore.Images.Media.DATA}, null, null, null)
ContentResolver contentResolver=getContentResolver(); //查询本地资源文件 Cursor c=contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI //存放在map中显示在listview列表 //歌曲名 name[i]=c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME )); //歌曲id id[i]=c.getInt(c.getColumnIndex(MediaStore.Audio.Media. _ID)); //作者 artical[i]=c.getString(c.getColumnIndex(MediaStore.Audio.Media.ARTIST )); //路径 url[i]=c.getString(c.getColumnIndex(MediaStore.Audio.Media.DATA