Andrfoid 11 通过Glide下载图片音视频等文件,使用 MediaStore 和 ContentResolver 将文件保存到公共目录,跳过MANAGE_EXTERNAL_STORAGE权限
fun downloadFile(url: String) {Glide.with(this).asFile().load(url).listener(object : RequestListener<File?> {override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<File?>?, isFirstResource: Boolean): Boolean {return false}override fun onResourceReady(resource: File?, model: Any?, target: Target<File?>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {saveFile(this@FlowActivity, resource, "image")return false}}).submit()}fun saveFile(context: Context, file: File?, mimeType: String): Uri? {var folderName = "Pictures"var extension = ".jpg"when (mimeType) {"gif" -> {extension = ".gif"}"image" -> {extension = ".jpg"}"video" -> {extension = ".mp4"folderName = "Movies"}"audio" -> {extension = ".mp3"folderName = "Music"}"pdf" -> {extension = ".pdf"folderName = "Documents"}}if (Build.VERSION.SDK_INT >= 29) {val values = ContentValues()values.put(MediaStore.Files.FileColumns.MIME_TYPE, mimeType)values.put(MediaStore.Files.FileColumns.DATE_ADDED, System.currentTimeMillis() / 1000)values.put(MediaStore.Files.FileColumns.DATE_TAKEN, System.currentTimeMillis())values.put(MediaStore.Files.FileColumns.RELATIVE_PATH, folderName)values.put(MediaStore.Files.FileColumns.IS_PENDING, true)values.put(MediaStore.Files.FileColumns.DISPLAY_NAME, "file_" + System.currentTimeMillis() + extension)var uri: Uri? = nullwhen {mimeType.contains("image") -> {uri = context.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)}mimeType.contains("video") -> {uri = context.contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values)}mimeType.contains("audio") -> {uri = context.contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values)}mimeType.contains("pdf") -> {uri = context.contentResolver.insert(MediaStore.Files.getContentUri("external"), values)}}uri?.apply {runCatching {saveFileToStream(contentResolver.openInputStream(Uri.fromFile(file))!!, contentResolver.openOutputStream(uri)!!)values.put(MediaStore.Video.Media.IS_PENDING, false)context.contentResolver.update(this, values, null, null)return this}.getOrElse {return null}}}return null}private fun saveFileToStream(input: InputStream, outputStream: OutputStream) {input.use { input ->runCatching {outputStream.use { output ->val buffer = ByteArray(4 * 1024) // or other buffer sizevar read: Intwhile (input.read(buffer).also { read = it } != -1) {output.write(buffer, 0, read)}output.flush()}}}}
写了个工具类方法
//把照片和视频复制一份到相册
fun copyFileToGallery(file: File, fileName: String) {val resolver: ContentResolver = MyApp.instance.contentResolverval values = ContentValues()val uriSavedVideo: Uri? = if (Build.VERSION.SDK_INT >= 29) {values.put(MediaStore.Files.FileColumns.DATE_ADDED, System.currentTimeMillis() / 1000)values.put(MediaStore.Files.FileColumns.DATE_TAKEN, System.currentTimeMillis())values.put(MediaStore.Files.FileColumns.RELATIVE_PATH, "Pictures/kkone")values.put(MediaStore.Files.FileColumns.IS_PENDING, true)values.put(MediaStore.Files.FileColumns.DISPLAY_NAME, fileName)if (fileName.contains("JPG")) {values.put(MediaStore.Files.FileColumns.MIME_TYPE, "image")resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)} else {values.put(MediaStore.Files.FileColumns.MIME_TYPE, "video")resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values)}} else {values.put(MediaStore.Files.FileColumns.TITLE, fileName)values.put(MediaStore.Files.FileColumns.DISPLAY_NAME, fileName)values.put(MediaStore.Files.FileColumns.DATE_ADDED, System.currentTimeMillis() / 1000)if (fileName.contains("JPG")) {values.put(MediaStore.Files.FileColumns.MIME_TYPE, "image")resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)} else {values.put(MediaStore.Files.FileColumns.MIME_TYPE, "video")resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values)}}uriSavedVideo?.apply {runCatching {val pfd = resolver.openFileDescriptor(this, "w") as ParcelFileDescriptorval out = FileOutputStream(pfd.fileDescriptor)val `in` = FileInputStream(file)val buf = ByteArray(8192)var len: Intwhile (`in`.read(buf).also { len = it } > 0) {out.write(buf, 0, len)}out.close()`in`.close()pfd.close()}if (Build.VERSION.SDK_INT >= 29) {values.clear()values.put(MediaStore.Files.FileColumns.IS_PENDING, 0)resolver.update(this, values, null, null)}}
}
Andrfoid 11 通过Glide下载图片音视频等文件,使用 MediaStore 和 ContentResolver 将文件保存到公共目录,跳过MANAGE_EXTERNAL_STORAGE权限相关推荐
- python自动搜索爬取下载文件-python批量爬取下载抖音视频
本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...
- python爬取抖音用户数据_python批量爬取下载抖音视频
本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...
- python3 def download_python3下载抖音视频
python3下载抖音视频 发布时间:2019-05-30 11:12, 浏览次数:401 , 标签: python # -*- coding:utf-8 -*- from contextlib im ...
- 图片音视频应用开发的工具与服务大礼包
http://digi.163.com/15/0225/17/AJAK1300001664LU.html [IT168 资讯]信息的传递是通过多个渠道的,在各种宽带技术高度发达的今天,人们接受的信息是 ...
- python编程实例视屏-python 下载抖音视频示例源码
[实例简介] 下载抖音视频 [实例截图] [核心代码] #code:utf-8 import requests from bs4 import BeautifulSoup import json se ...
- python之批量下载抖音视频
python批量下载抖音视频 知识储备:博主是在Pycharm下进行的 文件夹:dou_ying 1:在文件夹doy_ying下新建第一个文件:dou_ying_video_download.py 代 ...
- 《2019/04/12》java下载抖音视频
java下载抖音视频 下载抖音视频,获取到抖音视频的下载地址之后,类似: String url = "https://aweme.snssdk.com/aweme/v1/play/?vide ...
- Python爬虫学习,批量爬取下载抖音视频
这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙 项目源码展示 ''' 注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料, ...
- python抖音表白程序代码_python 下载抖音视频示例源码
[实例简介] 下载抖音视频 [实例截图] [核心代码] #code:utf-8 import requests from bs4 import BeautifulSoup import json se ...
最新文章
- Visual Paradigm 教程[UML]:如何使用刻板印象和标记值?(上)
- 监测磁盘文件是否被修改程序
- java实例拷贝,Apache Commons包 BeanUtils 对象拷贝实例demo
- C# 系统应用之透明罩MyOpaqueLayer实现360界面阴影效果
- netcore开源框架_.NET Core开发精选文章目录,持续更新,欢迎投稿!
- 2019 年 8 月编程语言排行榜,C#重回增长之路
- 图论 —— 最短路 —— Floyd 算法
- opencv运行出现错误
- DOM操作 append prependTo after before
- Django 的第三方包
- Ubuntu 左边栏和顶栏都不见了,ctrl+alt+t 也调用不出terminal
- 上拉电阻与下拉电阻介绍
- github下载的代码、怎么使用 python_Python学习20-补充内容之GitHub安装使用
- 中国无线电频率分配表
- his系统管理工具配置服务器,HIS系统(his管理系统)V3.0.1 官网版
- Archlinux kde 美化
- 最新十大透支健康行业(2019年版)
- python查找单词的位置_Python实现单词查询文件查找
- 软件测试常见的开发模型
- 【高并发】解密导致并发问题的第三个幕后黑手——有序性问题
热门文章
- (ICIP-2021)手臂摆动在视频步态识别中具有判别性,可用于运动员重识别
- 乐高无限无法进入服务器,乐高无限6月13日更新公告 修复部分玩家无法进入游戏等问题...
- php 三元运算?:和合并运算符??
- 增量式PID的P和I怎么理解(一)
- 删除C++ string中的空格
- epub电子书xml添加下着重号样式(二) 样式直接拿走
- UE4 控制台 不能调出
- 用tensorflow求解吴恩达的机器学习练习题(ex1)
- 西湖论剑2022部分misc
- windows 任务栏的电源图标不见了,怎么找回这个电源图标?