首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在DownloadManager上下载并在setDestinationInExternalFilesDir()中保存文件在Android10上不起作用

在Android 10上使用DownloadManager进行文件下载并将文件保存到setDestinationInExternalFilesDir()指定的路径时遇到问题,可能是由于以下几个原因:

基础概念

DownloadManager是Android系统提供的一个服务,用于处理长时间运行的HTTP下载。它提供了一个简单的API来处理网络请求,并且能够在下载完成后通知应用。setDestinationInExternalFilesDir()方法用于指定下载文件的保存路径,这个路径是应用的私有目录,外部应用无法访问。

相关优势

  • 后台下载:即使应用不在前台运行,DownloadManager也能继续下载文件。
  • 网络变化处理:DownloadManager能够处理网络变化,比如从WiFi切换到移动数据。
  • 错误处理:DownloadManager提供了错误处理机制,能够在下载失败时通知应用。

应用场景

适用于需要后台下载文件的应用,如新闻应用下载文章附件,或者应用更新等。

可能的问题及原因

  1. 存储权限问题:Android 10引入了分区存储(Scoped Storage),对文件访问权限进行了限制。
  2. 路径问题:指定的保存路径可能不正确或者不被系统接受。
  3. 系统限制:某些系统级别的限制可能会影响文件的保存。

解决方法

  1. 检查存储权限:确保应用已经申请了必要的存储权限。在Android 10及以上版本,需要在AndroidManifest.xml中声明MANAGE_EXTERNAL_STORAGE权限,并在运行时请求用户授权。
代码语言:txt
复制
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
  1. 适配分区存储:使用MediaStore API来保存文件,这样可以更好地兼容分区存储。
代码语言:txt
复制
ContentValues values = new ContentValues();
values.put(MediaStore.Downloads.DISPLAY_NAME, "filename.ext");
values.put(MediaStore.Downloads.MIME_TYPE, "application/octet-stream");
values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

Uri uri = getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("your_download_url"));
request.setDestinationUri(uri);
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
dm.enqueue(request);
  1. 检查路径:确保setDestinationInExternalFilesDir()中指定的路径是有效的,并且应用有权限写入该路径。
代码语言:txt
复制
File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "filename.ext");
Uri destinationUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", file);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("your_download_url"));
request.setDestinationUri(destinationUri);
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
dm.enqueue(request);

参考链接

请根据具体情况调整上述代码,并确保遵循最新的Android开发指南和政策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android开发笔记(六十一)文件下载管理DownloadManager

下载请求 要想使用下载功能,首先得构建一个下载请求,说明从哪里下载、下载参数为何、下载的文件保存到哪里等等。...Request.setDestinationInExternalFilesDir : 设置下载文件在本地的保存路径。...查询下载进度 虽然下载进度可在通知栏上查看,但是有时APP自身也想了解当前的下载进度,那就要调用DownloadManager的query方法。...2、下载进行时的通知栏点击事件:在下载过程中,用户点击通知栏上的下载任务,系统便发出action为DownloadManager.ACTION_NOTIFICATION_CLICKED(android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED...后来在实际开发中测试发现,DownloadManager其实比较智能,当网络一直是允许类型时,任务会一直下载;当网络断开或者不在允许范围内时,任务会自动暂停下载;只要网络连上或者切换到允许范围内,那么任务会自动恢复下载

5.3K51
  • 详解ConcurrentLinkedQueue,有两下子!

    案例分析考虑一个多线程下载管理器,其中多个线程需要从队列中获取URL并下载文件:public class DownloadManager { private final ConcurrentLinkedQueue...downloadFile**方法**:这是一个私有方法,模拟下载文件的逻辑。在实际应用中,这里将包含下载文件的代码。...优缺点分析优点线程安全:无需额外同步即可在多线程中安全使用。高性能:基于CAS操作,具有较高的并发性能。无界队列:理论上可以存储无限数量的元素。缺点无容量限制:可能导致内存溢出,需要合理控制队列大小。...运行程序的步骤:保存文件:将上述代码保存为名为ConcurrentLinkedQueueDemo.java的文件。...编译程序:打开命令行工具,导航到保存文件的目录,并运行javac ConcurrentLinkedQueueDemo.java命令编译Java程序。

    29921

    Flutter 下载器 | flutter_download_manager源码解析

    前言 内容类应用中图片或文件下载,一般应用中应用更新和升级,这些都是经典的下载场景。下载是项目中基础且重要的模块。...部分下载功能 队列下载 暂停、取消或恢复下载 并行文件下载(2 个或可以更改) 支持批量下载 支持平台: Linux | MacOS | Windows | Android | iOS 使用方法 简单下载一个文件...(这样的设计是不是看起来更 Dart) 任务请求抽象:DownloadRequest 重点说下 cancelToken,该字段在暂停,取消,恢复下载任务实现中起了关键作用。...任务管理表,里面的事情一般不会去记,在脑子里面。软件开发中,PM 该表格维护者。 完成某任务一般流程如下: 生成一个任务请求表达意愿。 查询任务管理表中任务状态并决定是否有资格真正添加到请求列表。...下载过程中如果之前暂停未下载完毕的文件,通过设置 header 中 range:bytes 来实现断点续传,将后续请求到文件存放到.temp中,然后追加到原未下载完成文件后。(下述第 29 行)。

    1.1K20

    【r_upgrade】快来升级你的Flutter应用

    image 介绍 在移动开发过程中,应用升级是必不可少的一个环节,所以,r_upgrade应用升级插件就出现了,这里先鼓掌欢迎??...Android热更新 开始吧 1.使用插件: 在pubspec.yaml文件添加下面代码 dependencies: r_upgrade: last version 2.使用打开链接的方式进行更新...: true: 调用系统的DownloadManager进行下载 优势:接入简单,无需担心操作,下载全由系统管理 劣势:无法使用http方式进行下载,无法在下载过程中点击通知栏进行暂停,无法根据有无网络进行暂停和继续下载...热更新 (使用 DownloadManager) 你可以使用升级返回的id进行热更新,下载的文件需要将新版本生成的isolate_snapshot_data、kernel_blob.bin、vm_snapshot_data...'))); } - 重启应用即可 注意,在Android应用中,请确保AndroidManifest.xml中声明以下权限,并在6.0系统上进行动态授权,不然会调用升级方法将抛出权限异常

    1.6K50

    Android8.0、9.0、10.0、11.0的新特性兼容适配代码修改

    《Android Studio开发实战 从零基础到App上线(第2版)》在书后面的附录中给出了Android8和Android9的主要特性说明,附录表格如下图所示: 不过附录表格只涵盖了常见的功能代码适配...此时要在network模块的res目录下面创建xml目录,并在xml目录下新建文件network_security_config.xml,文件内容如下所示: Android10默认开启沙箱模式,即使已经动态申请了存储卡读写权限,在外部存储上读写文件仍然失败。...此时要在代码中添加版本号判断,如果当前系统版本大于等于29,就不再开关WiFi,代码例子如下: if (Build.VERSION.SDK_INT >= 29) { // Android10...在Android10及以下版本,该值默认为true,但从Android11开始该值默认为false。 设置代码示例如下: // 设置是否允许访问文件,如WebView访问存储卡的文件。

    1.1K20

    Android开发工具类之DownloadManagerPro

    DownloadManager.Request用来请求一个下载,DownloadManager.Query用来查询下载信息。...1、int[] getBytesAndStatus(long downloadId) 这个方法就是传入我们上面所说的那个enqueue接口返回的下载id,可以获取到这个下载文件已经下载了多大,总共多大,...2、int[] getDownloadBytes(long downloadId) 这个方法就是传入下载id,可以获取到已经下载了多大,总共这个下载文件有多大的信息,返回信息也是一个int数组。...3、int getErrorCode(long downloadId) 这个方法是传入下载id,得到的返回信息就是这个文件下载失败的错误代码,error code。...() 这个方法就是判断在DownloadManager中是否存在停止下载的和重新下载的方法 10、int pauseDownload(long... ids) 这个方法就是传入多参数的id,停止响应下载

    70790

    Block 详解

    操作 在开始研究Block的copy操作之前,先来思考一下:Block是存储在栈上还是堆上呢?...栈块存在于栈内存中, 超出其作用域则马上被销毁 堆块存在于堆内存中, 是一个带引用计数的对象, 需要自行管理其内存 简而言之,存储在栈中的Block就是栈块、存储在堆中的就是堆块、既不在栈中也不在堆中的块就是全局块...栈上的Block,如果其所属的变量作用域结束,该Block就被废弃,如同一般的自动变量。当然,Block中的__block变量也同时被废弃。如下图: 图片上传中......(image-16f5c5-1566284363726-0) 通过forwarding, 无论是在block中还是 block外访问block变量, 也不管该变量在栈上或堆上, 都能顺利地访问同一个__.../AFNetworking/AFNetworking/zip/master" //下载类 DownloadManager * downloadManager = [[DownloadManager

    1.1K50

    项目需求讨论 - Android App 升级

    因为Android6.0开始后,单纯的在AndroidManifest.xml中定义权限已经不够了。需要再代码中动态让用户来确定才能给APP相应的权限。...(下载APK当然要网络权限和把文件写入存储的权限) 那如果在Android6.0及以上的时候。我们该怎么来做,因为我是使用RxJava的。所以这里也推荐一个RxPermissions来进行获取权限。...RxPermissions项目地址 还有简书上达达达达sky 写的基于Rxjava 1.x的基础上的RxPermissions源码解析 (其中最新的RxPermissions中,RxPermissions.getInstance...,当DownLoadManager下载完成后,会发送一个DownloadManager.ACTION_DOWNLOAD_COMPLETE的广播,所以我们只要刚开始在启动Service的时候,注册一个广播...,监听 DownloadManager.ACTION_DOWNLOAD_COMPLETE,然后当下载完成后,在BroadcastReceiver中调用安装APK的方法即可。

    12610

    一种下载管理方案的设计与实现

    1.2 第三方开源下载组件 Github上存量的具有相对完整功能的下载组件并不多,较为突出的有FileDownloader。支持在独立的下载进程进行下载保证健壮性,并支持替换网络请求框架。...任务在排队队列中等待,直到下载队列中有任务被删除后根据排队队列中的优先级继续一个任务的下载。排队中的任务可被直接停止或取消。 (4)已停止(Stopped)。...对未指定优先级的处理在启动下载的dlStart方法中的“设置任务优先级”部分,设计此项可为多次执行的下载任务改变优先级。...(实际上移动端通常采用的做法是单文件单线程,因为这样足够用),增强了一定的健壮性。...(onProgress)在下载过程中不断被调用,完成文件写入和进度保存(内存和数据库)。

    2.8K121

    Flutter 下载篇 - 贰 | 当下载器遇上网络库切换

    在优缺点中提到,该库纯Dart实现,支持下载管理,暂停,恢复,取消和断点续传。其中有个缺点是网络库与dio强耦合,不支持自定义网络库扩展。...设计上遵循DIP原则,抽象不要依赖具体实现细节,具体细节依赖抽象,我们需要抽象网络层来给项目依赖而非直接依赖dio。 快速切换到其他网路库。...思路:将网络相关操作抽象成接口,依赖注入到downloadManager对象中。...下载器设计 目的:下载器与具体实现downloadmanager解耦 思路:downloadmanager中提供了addDownload等下载通用方法及下载管理逻辑抽象。...网络库隔离效果 通过依赖注入到DownloadManager中即可。 如此就完成了对flutter_download_manager的网络库扩展改造,实现了一个可定制化的网络框架的下载库。

    45530

    Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife

    创建应用的方式,在天气App的第一篇文章中已经说明了,先不要着急去看,听我说完,创建应用需要几个条件,发布版SHA1、开发版SHA1、应用包名。 ① 开发版SHA1的作用是什么?   ...另一种情况,比如之前的项目在文件夹A下,现在你挪到文件夹B下,那么你同样需要再次获取项目的开发版SHA1的值,更新平台上的开发版SHA1值。 ③ 怎么获取开发版SHA1?   ...这里的SHA1就是开发版SHA1,然后将SHA1值更新一下再保存。 现在你再运行一般来说就不会出现定位不成功的情况,也不会出现SDK鉴权失败的情况了。 ④ 发布版SHA1的作用是什么?   ...开发版SHA1的作用是让你在电脑本地通过Android Studio调试运行的时候,能够使用正常使用SDK中功能。...获取系统下载服务 DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE

    1.4K20

    perfetto分析Native和java内存

    最后trace数据会保存在手机目录下,使用adb命令pull即可。 2. 执行脚本获取数据下载最新脚本heap_profile,执行 ....trace文件保存目录会在终端打印出来,也可执行脚本时添加-o参数保存到指定目录,该目录初始需要是空目录。...:存储一个调用堆栈的内存分配或释放大小可以在perfetto网站中写sql语句查询,也可将trace文件转为数据库表,自己写脚本分析。...最后trace数据会保存在手机目录下,使用adb命令pull即可。 2. 执行脚本获取数据下载最新脚本java_heap_profile,执行 ....trace文件保存目录会在终端打印出来,也可执行脚本时添加-o参数保存到指定目录,该目录初始需要是空目录。

    2K10

    Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)

    开发流程 1.开发前言 2.上传应用到分发平台 3.版本数据请求与存储 4.检查版本更新、自定义更新提示弹窗 5.下载应用、安装应用 1.开发前言   对于任何APP来说基本上都会有自动更新这个功能,...首先增加样式文件,在mvplibrary下面的styles.xml中 ? 在view下新增一个dialog文件夹,然后一一创建下面的文件 AlertDialog.java package com.llw.mvplibrary.view.dialog; import android.app.Dialog...获取系统下载服务 DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE...(request); } 这里我调用了系统的DownloadManager进行下载,在通知栏进行,不过这个需要配置一个广播接收器,新建一个DownloadApkReceiver ?

    1.4K20

    《Android Studio开发实战 从零基础到App上线》本书内容问题答疑

    3、关于本书附录源码的注释文字 问题:我在百度网盘下载了源码,代码里的注释很少,我零基础都看不懂怎么办?...即使你在设置中开启存储权限,重启app也看不到购物车商品图片,这是因为代码有判断SharedPreferences保存的first数值,如果不是首次运行则不进行图片加载操作。...解决办法参见上一点的说明“关于第4章和第5章的购物车商品图片在部分手机上无法显示的问题”。 2)Android7.0能拍照但不能保存,这是因为Android7.0默认禁止访问sd卡导致的。...3)部分手机使用DownloadManager下载图片会闪退。...其中V1是必须勾选的,否则打出来的apk文件无法正常安装。V2建议也勾选,该选项可避免Janus漏洞。 如果想成功上架,就要同时勾选V1和V2。

    1.2K30

    Android中的热修复

    Android中的类加载是通过DexClassLoader,在DexClassLoader中使用DexpathList将所有的dex文件加载到dexElements数组中,在进行.class加载的时候,...这一步发生在App中,App需要下载补丁文件,然后使用dexpath将下载到的补丁文件中的dex、so、res文件和基准文件做全量合并,dex、so文件会被合并成tinker_classN.apk,res...Android在加载类的时候,会遍历pathList对象的dexElements数组,该数据中是apk下所有dex文件的信息,在开始加载class文件的时候,会遍历dexElements数组,查看class...上面是Tinker替换class文件的过程,对于so的库,Tinker同样是通过反射机制拿到pathList对象的nativeLibraryDirectories数组,该数组中保存了App需要使用的so...在Android10上禁止了dex文件的动态加载,所以无法对基准版本和patch文件的dex进行合并优化,从而无法实现类替换的功能,Tinker针对Android10,通过反射机制PackageManagerService

    2K10
    领券