首页
学习
活动
专区
工具
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.2K41
  • Android7.0版本影响开发的改进分析

    此权限策略的更改有多重副作用: 私有文件文件权限不应再由所有者放宽,为使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE而进行的此类尝试将触发SecurityException...分享私有文件内容的推荐方法是使用FileProvider。 DownloadManager不再按文件名分享私人存储的文件。...通过使用DownloadManager.Request.setDestinationInExternalFilesDir())或DownloadManager.Request.setDestinationInExternalPublicDir...())将下载位置设置为公共位置的老App仍可以访问COLUMN_LOCAL_FILENAME的路径,但是Google还是强烈反对使用这种方法。...保存这些元数据便于你Config变更后决定是否需要刷新缓存数据。 ③ 避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用dp等单位。

    87110

    详解ConcurrentLinkedQueue,有两下子!

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

    24621

    Flutter 下载器 | flutter_download_manager源码解析

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

    1.1K20

    基于DownloadManager的简单下载器编写小结

    一直听说过Android自带的DownloadManager,只是拖延症发作,一直没有时间去研究研究,其实在很多项目开发,都有一个功能是非常重要的,那就是应用的检查更新了!...| DownloadManager.Request.NETWORK_WIFI); //通知栏设置 //显示通知栏 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE...= new int[]{ -1, -1, 0 }; //通过构建下载请求时获得的downloadId进行文件查询 DownloadManager.Query query...} } } }; //注册,这里只能拦截文件下载成功的广播,并不能进行进度监听,适当的地方取消订阅广播 context.registerReceiver.../** * 由于DownloadManager自身没有提供实时进度的api,所以通过以下定时器获取已下载文件大小 */ private void updateProgress() {

    90410

    详解Android10的分区存储机制(Scoped Storage)适配教程

    分区存储将影响Android10系统首次安装启动、且targetSdkVersion =29的应用。需要访问和共享外部存储文件的应用会受到影响,需要进行兼容性适配。...影响范围: Android 10运行的应用: 1.targetSdkVersion <= 28,不受影响 2.如果targetSdkVersion = 29,默认情况应用外部存储可见性将被过滤...应用想要获取当前应用的专有存储目录路径是可以用Context.getExternalFilesDir()的方式获取。...共享媒体集合存储 共享媒体集合存储中保存媒体文件时,需要根据文件的类型选择MediaStore。...// 把图片下载到共有媒体集合并在相册显示 // 创建ContentValues, 并加入信息 val values = ContentValues() values.put(MediaStore.Images.Media.DESCRIPTION

    3.4K32

    【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,文件内容如下所示: <?...1、Android10默认开启沙箱模式,即使已经动态申请了存储卡读写权限,在外部存储读写文件仍然失败。...此时要在代码添加版本号判断,如果当前系统版本大于等于29,就不再开关WiFi,代码例子如下: if (Build.VERSION.SDK_INT >= 29) { // Android10...Android10及以下版本,该值默认为true,但从Android11开始该值默认为false。 设置代码示例如下: // 设置是否允许访问文件,如WebView访问存储卡的文件

    1.1K20

    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开发工具类之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,停止响应下载

    69390

    Android多线程下载示例详解

    一、概述 说到Android文件下载,Android API明确要求将耗时的操作放到一个子线程执行,文件下载无疑是需要耗费时间的,所以要将文件下载放到子线程执行。...二、服务端准备 在这个小例子我以下载有道词典为例,在网上下载有道词典的安装包,eclipse中新建项目web,将下载的有道词典安装包放置WebContent目录下,并将项目发布到Tomcat...id private int threadId; //下载文件路径 private String path; //保存文件 private File file; //下载的进度条更新的监听器...类 这个类主要是对下载过程的管理,包括下载设置下载文件保存的位置,计算多线程每个线程的数据下载量等等。...事件,onClick事件开启一个线程进行下载操作,同时子线程获取到的数据,通过handler与Message机制传递到主线程,更新界面显示。

    1.2K10
    领券