Android Q Download文件存储

这篇具有很好参考价值的文章主要介绍了Android Q Download文件存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

11 以上 存放 Download 目录中 只能通过uri 进行读取 且只能APP 安装后存放的文件 才有访问权限
APP 卸载之后 数据库中权限会被移除 无法再通过文件名称进行查询
这边通过比较描述字段进行判断是否下载过文件
11 以上APP进行卸载后在安装下载 会出现重复文件

不知是否还有其他解决方案

  1. 将文件下载至缓存目录中

  2. 复制文件至Download目录中

    fun copyFileToDownload(context:Context, oldPath:String, targetDirName:String) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            copyFileToDownloadDir(context, oldPath, targetDirName)
        } else {
            var newPath = FileUtils.getExternalDownloadsPath() + File.separator +targetDirName + File.separator + File(oldPath).name
            var filePara = File(FileUtils.getExternalDownloadsPath() + File.separator + targetDirName)
            if (filePara.exists()) {
                filePara.mkdirs()
            }
            FileUtils.copyFile(oldPath, newPath)
        }
    }
    
     @RequiresApi(Build.VERSION_CODES.Q)
    fun copyFileToDownloadDir(context:Context, oldPath:String, targetDirName:String):Uri? {
        try {
            val oldFile = File(oldPath)
            //设置目标文件的信息
            val values = ContentValues()
            values.put(MediaStore.Images.Media.DESCRIPTION, oldFile.name)
            values.put(MediaStore.Files.FileColumns.DISPLAY_NAME, oldFile.name)
            values.put(MediaStore.Files.FileColumns.TITLE, oldFile.name)
            values.put(MediaStore.Files.FileColumns.MIME_TYPE, oldPath.getMimeType())
            val relativePath = Environment.DIRECTORY_DOWNLOADS + File.separator + targetDirName
            values.put(MediaStore.Images.Media.RELATIVE_PATH, relativePath)
            val downloadUri = MediaStore.Downloads.EXTERNAL_CONTENT_URI
            val resolver = context.contentResolver
            val insertUri = resolver.insert(downloadUri, values)
            if (insertUri != null) {
                val fos = resolver.openOutputStream(insertUri)
                if (fos != null) {
                    val fis = FileInputStream(oldFile)
                    fis.copyTo(fos)
                    fis.close()
                    fos.close()
                    return insertUri
                }
            }
        } catch (e:Exception) {
            e.printStackTrace()
        }
        return null
    }
    
    
    
  3. 通过查询 DESCRIPTION字段判断文件是否存在文章来源地址https://www.toymoban.com/news/detail-845922.html

   fun findDownloadsFile(context:Context,targetDirName:String, description:String):ArrayList<Uri>? {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            return findDownloadsUri4Description(context,targetDirName, description)
        } else {
            var newPath = FileUtils.getExternalDownloadsPath() + File.separator + targetDirName + File.separator + description
            var file = File(newPath)
            if (file.exists()) {
                var uri = FileUtils.getFile2Uri(file)
                var list = ArrayList<Uri>()
                uri?.let { list.add(it) }
                return list
            } else {
                return null

            }
        }
    }
        /**
     *  通过描述 字段 查询 下载目录中的文件
     * @param context Context
     * @param dirName String?  子目录
     * @param description String  描述字段
     * @return ArrayList<Uri>
     */
    @RequiresApi(Build.VERSION_CODES.Q)
    fun findDownloadsUri4Description(context:Context, dirName:String?, description:String):ArrayList<Uri> {
        val resultList = ArrayList<Uri>()
        try {
            val resolver = context.contentResolver
            val downloadUri = MediaStore.Downloads.EXTERNAL_CONTENT_URI
            var selection:String? = null

            var selectionArgs = mutableListOf<String>()
            if (dirName != null && dirName.isNotEmpty()) {
                selection = MediaStore.Files.FileColumns.BUCKET_DISPLAY_NAME + " = ? AND "
                selectionArgs.add(dirName)
            }
            selection = selection + MediaStore.Images.Media.DESCRIPTION + " = ? "
            selectionArgs.add(description)

            val resultCursor = resolver?.query(downloadUri, null, selection, selectionArgs.toTypedArray(), null)
            if (resultCursor != null) {
                val fileIdIndex = resultCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)
                while (resultCursor.moveToNext()) {
                    val fileId = resultCursor.getLong(fileIdIndex)
                    val pathUri = downloadUri.buildUpon().appendPath("$fileId").build()
                    resultList.add(pathUri)
                }
                resultCursor.close()
            }
        } catch (e:Exception) {
            e.printStackTrace()
        }
        return resultList
    }
	

到了这里,关于Android Q Download文件存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据泵(impdb)导入Oracle分片的数据库dump文件

    data_dir为路径名称,可自命名。路径是导出的dmp文件存放的路径必须存在。 查询用户创建目录 上面命令只是指定了导出文件存放的路径,但是这个路径需要自己手动创建和赋权 注意:在导入数据的时候需要检查源数据的表空间大小,默认表空间最大只有32G,超过容量会导致

    2024年02月08日
    浏览(58)
  • 导出Oracle数据库sqlplus命令行查询的结果到文件

    在Oracle数据库sqlplus命令行操作时,如果想将SQL查询出来的结果导出到文件中,可以使用SQLPlus中的 SPOOL 命令来将查询结果导出到文件。 1.开启日志记录:使用SPOOL命令,指定需要输出的文件路径及文件名。例如: SPOOL /存放路径/oracle.txt 2.执行SQL查询语句:你可以输入任何需要

    2024年02月15日
    浏览(36)
  • 查询服务器tns文件路径,oracle数据库tns配置方法详解

    Oracle中TNS的完整定义:transparence Network Substrate透明网络底层, 监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。 上图中的CGDB和STDCG就是对应的TNS,HOST是指向数据库服务器的IP,当然局域网内用计算机名称也是可以的。通过客户端Net Manager创建一个连接到数据

    2024年02月09日
    浏览(63)
  • 【Android入门到项目实战--4.5】—— SQLite数据库存储实现增删改查

    目录 一、添加数据 二、更新数据 三、删除数据 四、查询数据 使用完整SQL语言操作数据库 1、添加数据  2、更新数据 3、删除数据  4、查询数据 前面学习了创建和升级数据库,本篇文章主要讲解SQLite数据库存储实现增删改查(CRUD)操作。         调用SQLiteOpenHelper的get

    2024年02月04日
    浏览(52)
  • ArcGIS Server 数据存储之注册文件夹及数据库

    使用 ArcGIS Server 管理器将数据目录和数据库注册到 ArcGIS Server。数据注册为服务器提供了服务源数据的来源位置列表。数据注册具有以下优点: 数据注册可帮助您验证服务是否引用服务器管理员已知和批准的数据位置。 数据注册允许 ArcGIS Server 在将地图、模型或其他资源

    2024年04月13日
    浏览(34)
  • Android开发----实现登录注册页面(创建本地数据库,对注册的账户密码进行存储)

    写在前面: 本文实现了登录注册页面的开发,创建了本地数据库,存储注册的账户密码。注册账户为手机号,对账户为手机号进行了正则化验证。登录成功跳转至主页面。 20221028-实现登录注册功能 首先说一下,项目部署是在原有项目新建两个activity( 项目右键–new–activi

    2024年02月03日
    浏览(55)
  • Oracle ORA-01033: ORACLE initialization or shutdown in progress(误删了DBF数据库文件导致)解决方法

    先声明一下前期的一些手欠欠儿的操作导致oracl登录不进去了,起先是清理磁盘空间的时候误删除了orcle DBF数据文件后无法进入系统,plsql登录报错如下: 一般情况下,删除表空间的正确方法是: DROP TABLESPACE BDCDJ INCLUDING CONTENTS AND DATAFILES; 如果没有通过以上命令删除而直接删

    2024年02月02日
    浏览(63)
  • Hive数据库系列--Hive文件格式/Hive存储格式/Hive压缩格式

    本篇主要讲解一下Hive的文件格式,官方文档见《 https://cwiki.apache.org/confluence/display/Hive/FileFormats》、《 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormatsStorageFormatsRowFormat,StorageFormat,andSerDe》 HIve的文件存储格式常见的有四种:textfile 、sequencefile、or

    2024年01月22日
    浏览(41)
  • 一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=value)对组成。MongoDB 文档类

    2024年01月17日
    浏览(40)
  • 【100天精通python】Day44:python网络爬虫开发_爬虫基础(爬虫数据存储:基本文件存储,MySQL,NoSQL:MongDB,Redis 数据库存储+实战代码)

    目录 1 数据存储 1.1 爬虫存储:基本文件存储 1.2 爬虫存储:使用MySQL 数据库 1.3 爬虫 NoSQL 数据库使用 1.3.1 MongoDB 简介

    2024年02月11日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包