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权限相关推荐

  1. python自动搜索爬取下载文件-python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  2. python爬取抖音用户数据_python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  3. python3 def download_python3下载抖音视频

    python3下载抖音视频 发布时间:2019-05-30 11:12, 浏览次数:401 , 标签: python # -*- coding:utf-8 -*- from contextlib im ...

  4. 图片音视频应用开发的工具与服务大礼包

    http://digi.163.com/15/0225/17/AJAK1300001664LU.html [IT168 资讯]信息的传递是通过多个渠道的,在各种宽带技术高度发达的今天,人们接受的信息是 ...

  5. python编程实例视屏-python 下载抖音视频示例源码

    [实例简介] 下载抖音视频 [实例截图] [核心代码] #code:utf-8 import requests from bs4 import BeautifulSoup import json se ...

  6. python之批量下载抖音视频

    python批量下载抖音视频 知识储备:博主是在Pycharm下进行的 文件夹:dou_ying 1:在文件夹doy_ying下新建第一个文件:dou_ying_video_download.py 代 ...

  7. 《2019/04/12》java下载抖音视频

    java下载抖音视频 下载抖音视频,获取到抖音视频的下载地址之后,类似: String url = "https://aweme.snssdk.com/aweme/v1/play/?vide ...

  8. Python爬虫学习,批量爬取下载抖音视频

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙 项目源码展示 ''' 注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料, ...

  9. python抖音表白程序代码_python 下载抖音视频示例源码

    [实例简介] 下载抖音视频 [实例截图] [核心代码] #code:utf-8 import requests from bs4 import BeautifulSoup import json se ...

最新文章

  1. Visual Paradigm 教程[UML]:如何使用刻板印象和标记值?(上)
  2. 监测磁盘文件是否被修改程序
  3. java实例拷贝,Apache Commons包 BeanUtils 对象拷贝实例demo
  4. C# 系统应用之透明罩MyOpaqueLayer实现360界面阴影效果
  5. netcore开源框架_.NET Core开发精选文章目录,持续更新,欢迎投稿!
  6. 2019 年 8 月编程语言排行榜,C#重回增长之路
  7. 图论 —— 最短路 —— Floyd 算法
  8. opencv运行出现错误
  9. DOM操作 append prependTo after before
  10. Django 的第三方包
  11. Ubuntu 左边栏和顶栏都不见了,ctrl+alt+t 也调用不出terminal
  12. 上拉电阻与下拉电阻介绍
  13. github下载的代码、怎么使用 python_Python学习20-补充内容之GitHub安装使用
  14. 中国无线电频率分配表
  15. his系统管理工具配置服务器,HIS系统(his管理系统)V3.0.1 官网版
  16. Archlinux kde 美化
  17. 最新十大透支健康行业(2019年版)
  18. python查找单词的位置_Python实现单词查询文件查找
  19. 软件测试常见的开发模型
  20. 【高并发】解密导致并发问题的第三个幕后黑手——有序性问题

热门文章

  1. (ICIP-2021)手臂摆动在视频步态识别中具有判别性,可用于运动员重识别
  2. 乐高无限无法进入服务器,乐高无限6月13日更新公告 修复部分玩家无法进入游戏等问题...
  3. php 三元运算?:和合并运算符??
  4. 增量式PID的P和I怎么理解(一)
  5. 删除C++ string中的空格
  6. epub电子书xml添加下着重号样式(二) 样式直接拿走
  7. UE4 控制台 不能调出
  8. 用tensorflow求解吴恩达的机器学习练习题(ex1)
  9. 西湖论剑2022部分misc
  10. windows 任务栏的电源图标不见了,怎么找回这个电源图标?