文章目录 一、动态权限申请 二、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
(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(
文章目录 一、报错信息 二、解决方案 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 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
文章目录 一、分区存储模式下使用 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}
_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
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);
具体的适配逻辑参考篇头的文章~ 二、公共目录下资源访问 Google建议我们采用 mediaStore 或者 SAF 去访问。...(MediaStore.Images.Media.DISPLAY_NAME, "Image.png"); values.put(MediaStore.Images.Media.MIME_TYPE, "image.../png"); values.put(MediaStore.Images.Media.TITLE, "Image.png"); values.put(MediaStore.Images.Media.RELATIVE_PATH..., "Pictures/test"); Uri external = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; ContentResolver resolver...; String[] args = new String[] {imageName}; String[] projection = new String[] {MediaStore.Images.Media
解决方法 1:使用 MediaStore 接口访问公共目录中的多媒体文件,或者使用 SAF 访问公共目录中的任意文件。...注意:从 MediaStore 接口中查询到的 DATA 字段将在 Android Q 开始废弃,不应该利用它来访问文件或者判断文件是否存在;从 MediaStore 接口或者 SAF 获取到文件 Uri...问题原因 2:使用 MediaStore 接口访问非多媒体文件。 问题分析 2:在 Android Q 上,使用 MediaStore 接口只能访问公共目录中的多媒体文件。...解决方案:APP 应该将想要保留的文件通过 MediaStore 接口保存到公共目录下。...在 Fota 升级前,可以将 APP 的用户历史数据通过 MediaStore 接口迁移到公共目录下。
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) ?
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
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.
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
领取专属 10元无门槛券
手把手带您无忧上云