DownloadManager 在 INSUFFICIENT_SPACE_ERROR 之后不发送广播

2024-03-12

问题

If the cache目录已满,尝试执行简单请求将失败而不发送DownloadManager.ACTION_DOWNLOAD_COMPLETE播送。

Note:该问题很普遍,但大部分可以在缓存有限的低端设备上重现(/data/data/com.android.providers.downloads/cache) size.

The code

接收器配置正确,因为当操作成功并因其他原因失败时我仍然收到广播。

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://www.apkmirror.com/wp-content/themes/APKMirror/download.php?id=44753"));

    request.setTitle("Facebook");

    DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

    downloadManager.enqueue(request);

所需的解决方案

我对以下问题的解决方案感兴趣specific问题,或更多信息(如果您也遇到过)。
I'm not寻找一个需要我停止使用的解决方案DownloadManager或添加WRITE_EXTERNAL_STORAGE允许。

Logs

当缓存已满并且最后无法再容纳时,您可以观察以下日志入口(通过过滤)downloadmanager)

11-08 08:47:06.079 830-14261/? I/DownloadManager: Download 135 starting
11-08 08:47:06.989 830-14261/? W/DownloadManager: Downloads data dir: /data/data/com.android.providers.downloads/cache is running low on space. space available (in bytes): -6994124
11-08 08:47:06.999 830-14261/? I/DownloadManager: discardPurgeableFiles: destination = 2, targetBytes = 10485760
11-08 08:47:06.999 830-14261/? I/DownloadManager: Purged files, freed 0 for 10485760 requested
11-08 08:47:07.309 830-14261/? W/DownloadManager: Aborting request for download 135: not enough free space in the filesystem rooted at: /data/data/com.android.providers.downloads/cache and unable to free any more
11-08 08:47:07.319 830-14261/? I/DownloadManager: Download 135 finished with status INSUFFICIENT_SPACE_ERROR

这里有一个演示项目 https://github.com/furmana/TestDownloadManager这可以证明这个问题。请记住,此时缓存目录必须已满(不可清除的项目,根据我的经验,这基本上意味着下载中止)


由于DownloadManager本质上是一个系统ContentProvider,所以你可以向它注册自己的ContentObserver, 因此,当下载提供程序更新时,它会选择在 INSUFFICIENT_SPACE 的情况下通知观察者。

final DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
        context.getContentResolver().registerContentObserver(Uri.parse("content://downloads/my_downloads"),
                true, new ContentObserver(null) {
                    @Override
                    public void onChange(boolean selfChange) {
                        super.onChange(selfChange);
                        Cursor localCursor = downloadManager.query(
                                new DownloadManager.Query());
                        if (localCursor.getCount() == 0) {
                            localCursor.close();
                        }
                        localCursor.moveToFirst();
                        do {
                            if ((localCursor.getInt(localCursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) & DownloadManager.STATUS_FAILED )!=0) {
                                // Download failed, go see why
                                if (localCursor.getInt(localCursor.getColumnIndex(DownloadManager.COLUMN_REASON)) == DownloadManager.ERROR_INSUFFICIENT_SPACE){
                                    Log.w("DownloadStatus", " Download failed with ERROR_INSUFFICIENT_SPACE");
                                }
                            }
                        }while (localCursor.moveToNext());
                    }
                });

请注意,不要设置状态为 DownloadManager.STATUS_FAILED 的查询过滤器,因为 DownloadManager 奇怪地只将 400 到 600 之间的状态视为失败状态, 但 INSUFFICIENT_SPACE 的错误代码为 198...

android.app.DownloadManager.Request:

Cursor runQuery(ContentResolver resolver, String[] projection, Uri baseUri) {
 .....
 if ((mStatusFlags & STATUS_FAILED) != 0) {
                    parts.add("(" + statusClause(">=", 400)
                              + " AND " + statusClause("<", 600) + ")");
                }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DownloadManager 在 INSUFFICIENT_SPACE_ERROR 之后不发送广播 的相关文章

  • 从设备坐标系到绝对坐标系的加速度

    从我的 Android 设备中 我可以读取线性加速度值数组 在设备的坐标系中 和绝对方向值数组 在地球坐标系中 我需要的是获得后一个坐标中的线性加速度值 系统 我怎样才能转换它们 EDIT阿里在评论中回复后 好吧 如果我理解正确的话 当我测
  • 如何删除导航视图不必要的顶部填充?

    标题和图中显示的第一个项目之间有不必要的顶部填充 如何将其去除 你可以在这里找到源代码 https github com chrisbanes cheesesquare https github com chrisbanes cheeses
  • 使用 Spongy Castle 库生成 ECDH 中的密钥对

    我是台湾的学生 我正在学习如何在 Android 中编程 但我在使用 Spongy Castle 库在 ECDH 中生成密钥对时遇到问题 当我启动应用程序时 Android系统显示应用程序已停止 这是我的代码和我的导入 public cla
  • GridLayout 对齐列内的子项

    我有一个GridLayout由 6 个孩子组成 它的列数为 2 左列的子列有layout gravity of start end fill horizontal and layout width0dp 这会导致它们填满所有可用空间 Thi
  • kotlin中的三元运算符[重复]

    这个问题在这里已经有答案了 我可以用java写 int i 10 String s i 10 Ten Empty 即使我可以将它传递到方法参数中 callSomeMethod i 10 Ten Empty 如何将其转换为 kotlin 在
  • 在通知声音中暂停/恢复媒体播放器

    很容易检测到电话何时打入 通过phoneStateListener 但是其他通知声音 例如电子邮件或短信 又如何呢 在某些设备上 这些通知听起来很静音 但不会暂停任何当前正在运行的 mediaPlayer 实例 这对用户来说很烦人 理想情况
  • 在 Android 中使用 Facebook Achievement API

    我知道这可能看起来像一个通用问题 但找到有关该主题的信息似乎非常困难 因此 如果某个地方存在完整的示例 指南 源代码链接 我将不胜感激 我正在开发一款 Android 游戏 希望集成 Facebook 成就 我想要的只是在用户完成某个谜题时
  • 在操作栏中编辑文本

    我正在使用 Action Bar Sherlock 为我的应用程序创建 UI 在将依赖项添加到我的项目等后 我创建了一个活动来测试它 public class PPS extends SherlockActivity Override pu
  • Android 中未找到 PhoneGap 类错误

    我的 PhoneGap Android 应用程序遇到一些问题 到目前为止我明白了 我已经把一切都做好了 这是我所做的 在 Eclipse 中创建项目后 我在 libs 文件夹中添加了 cordova 2 2 0 jar 然后我编辑了Andr
  • 使用Web蓝牙API时找不到移动设备

    我正在学习 Web 蓝牙 API 使用 google 开发控制台 我无法找到我的移动设备 还尝试了 github 上提供的演示 https github com WebBluetoothCG demos https github com W
  • Android OpenGLES 渲染到纹理

    我为 iPhone 编写图形应用程序 并且希望将我最新的应用程序 Layers 移植到 Android 平台 Layers 是一款绘画应用程序 允许用户在屏幕上绘画并使用不同的画笔 颜色等创建多层绘画 并导出到 PSD 它有桌面同步 涂抹工
  • Zxing库无法解析

    我正在使用 zxing 库开发应用程序 我导入了zxing项目到我的工作场所 当我导入时遇到了一些问题 通过编译项目java 1 7 我做到了 CameraConfigurationUtils失踪 我从library source Reso
  • 如何使用 Kotlin 在 ListAdapter 中使用 Filterable?

    我会用一个SearchView过滤我的RecyclerView 在 stackoverflow 和其他网站上我发现只是使用的示例Filterable与 Java 和RecyclerView Adapter当我使用时ListAdapter 所
  • 带操作栏的 requestFeature

    所以我正在查看 google 的操作栏 api 演示 他们有这个 The Action Bar is a window feature The feature must be requested before setting a conte
  • React Native:即使文件不存在,也会出现 hprof 文件太大错误

    当我尝试跑步时git push origin master在我的 React Native 应用程序中 我得到 file android java pid60072 hprof is 564 94 MB this exceeds GitHu
  • 如何通过代码改变Android SlidingDrawer的方向?

    当我从横向模式更改为纵向模式时 我无法找到设置 SlidingDrawer 方向的方法 反之亦然 最初我将 xml 的方向设置为垂直 当手机处于横向模式时 我需要将方向更改为水平 因此我将手柄放在左侧 有人有什么想法吗 我认为按照标准这是不
  • android拦截最近的应用程序按钮

    我有一个针对儿童的应用程序 我不希望他们能够单击 最近使用的应用程序 按钮 看起来像两个矩形叠在一起的按钮 我正在负责捕获后退按钮和主页按钮 并且我已经搜索并阅读了很多有关尝试捕获 最近的应用程序 按钮的信息 但大多数人说你不能 或者他们的
  • 使用 jenkins.Creating .apk 文件生成 android 版本

    我正在使用 Jenkins 在 mac 上持续集成 android 应用程序 但是我无法使用 Jenkins 生成 apk 文件 就像我们在 iOS 应用程序中创建 ipa 一样 创建用于在 mac 上分发的 apk 文件的配置是什么 您可
  • java.net.ServerSocket.accept () 在 Android 上不返回

    我正在尝试找到一种方法来远程登录到未root的机器人 我有INTERNET权限处于活动状态 我的设备与我的设备连接在同一网络上Mac OS X通过 WiFi 我可以 ping 通我打开的端口 在最初的实验中 我让它在有根测试设备上工作 但我
  • Android 如何在按下或聚焦时使 TextView 文本变为粗体

    我的布局中有一个文本视图 我的要求是当我按下或聚焦它时 文本应该是粗体 否则应该使用普通字体 我该如何实施 使用下面的代码 TextView name TextView findViewById R id TextView01 name h

随机推荐

  • 如何在 ruby​​ on Rails 中调用存储过程?

    我是 ROR 新手 我想在单击 VIEW 中的提交按钮时调用存储过程进行处理 Model class Pro DataImport lt ActiveRecord Base attr accessible file name process
  • NamedPipe 多个服务器

    对于简单的 IPC 我选择了 NamedPipes 在进程 本地 之间进行通信 由于需求的变化 应该有多个服务器实例 这会导致同一管道名上有多个 侦听器 但似乎有一个问题 这些侦听器中只有一个会收到消息 其他所有实例都不会收到消息 有某种
  • Python 从装饰器导入模块

    我正在使用 Python 3 开发一个应用程序 而且我所做的事情是非常规的 cx Oracle 是一个很难设置的模块 对于我的应用程序来说是一个可选的依赖项 我想做的是将模块的导入包装在装饰器中 仅放置在使用它的函数之上 这将避免必须在我的
  • 递增循环的致命错误

    目前 我正在尝试创建一个函数 在 Fighter cpp 文件中的函数 sortFighters 中对充满战斗机的向量进行排序 一切似乎都可以正确编译 但是 当它运行时 我在上述 cpp 文件的某一行中收到致命错误 我确切地知道问题是什么
  • 未添加 NuGet 包的参考

    我有一个自定义 NuGet 包 My Resources 其中包含程序集和对另一个自定义 NuGet 包 My Base 的依赖项 如果我安装该软件包 安装会成功完成 但不会添加程序集引用 这是完整的输出Install Packagecom
  • 矩阵列表乘以标量,Rcpp 中不保留维度属性

    我正在使用 Rcpp 来加速一些 R 代码 实际上这是我 2014 年 待办事项 列表中的项目之一 部分代码包括将矩阵列表乘以标量 我能够得到结果 尽管如此 矩阵不再是矩阵 而是向量 我想要一个矩阵列表作为最终输出 这是我到目前为止的代码
  • htaccess 重定向百分号

    我遇到了 htaccess redirect 问题 在搜索了近一个小时后无法解决 请帮我 RewriteRule yeah http www domain de awesome 123123 NC QSA L R 301 所以我想从doma
  • 从 futures::Stream 转发到 futures::Sink

    我目前正在尝试了解 tokio futures 原语和生态系统 我开始做一些工作tk http websocket 示例 https github com swindon rs tk http blob abfdb50a00ab90b4f0
  • 在 C# 中导入 DLL

    我正在尝试使用 DllImport 将 dll 导入到我的 C 项目 如下所示 DllImport kernel32 private static extern long WritePrivateProfileString string s
  • 使用 HTML / CSS 显示/隐藏带有复选框的特定 Div

    我正在尝试找出一种方法来链接特定的复选框以显示 隐藏specificdiv 元素 我能够找到显示 隐藏 Div 元素的复选框的代码紧接在下面他们 但我想知道是否有一种方法可以将特定的复选框链接到我选择的任何 div 在我的代码中 我基本上想
  • 如何在 R 中获得 ping 响应

    我有一个包含域名列的数据框 我想通过 ping 域名来查看存在哪个域 我可以从以下函数获得单独的 ping 响应 ping lt function x stderr FALSE stdout FALSE pingvec lt system2
  • 应用自动调整大小时旋转期间 iOS8 MKMapView 帧缓冲区错误

    import AppDelegate h import
  • 如何将 gettext 与 python >3.6 f 字符串一起使用

    以前你会使用gettext如下 Hey format username 但是新的 Python 的 f 字符串呢 f Hey username Hey 按原样包含在您的翻译词典中 如果你使用f Hey username 这会创建另一个不会被
  • 如果父对象不是单例,那么子对象也是单例吗?

    我有一个不是单例的 Dao 从他扩展的其他对象 是否是单例 代码示例
  • 按数字顺序对文件进行排序

    我编写了一个程序将文件夹中的所有文件组合在一起 这是我的代码的一部分 File folder new File c some directory File listOfFiles folder listFiles for File file
  • Dplyr select 和 group_by 之间关于引用变量的区别?

    在当前版本的 dplyr 中 select参数可以按值传递 variable lt Species iris gt select variable Species 1 setosa 2 setosa 3 setosa 4 setosa 5
  • 是否可以从 Visual Studio 2013 创建 Windows 8 应用商店应用程序?

    因此 我有一台安装了 Visual Studio 2013 的 Windows 8 1 计算机 每当我去创建新的 Windows 应用商店项目时 我都看不到任何创建新的 Windows 8 应用商店应用程序的选项 而不是 Windows 8
  • 设置 32 英尺库

    我正在尝试开始使用这个库 32feet http 32feet codeplex com 我有一个 Broadcomm 蓝牙堆栈 但无法弄清楚如何设置该库 当我运行我的代码时 我得到 未处理的异常 System PlatformNotSup
  • Android连接错误java.lang.UnsupportedOperationException [重复]

    这个问题在这里已经有答案了 当我尝试连接到 mysql 数据库时 我在 android studio 上遇到问题 这是代码 public Connection getMySqlConnection Declare and initializ
  • DownloadManager 在 INSUFFICIENT_SPACE_ERROR 之后不发送广播

    问题 If the cache目录已满 尝试执行简单请求将失败而不发送DownloadManager ACTION DOWNLOAD COMPLETE播送 Note 该问题很普遍 但大部分可以在缓存有限的低端设备上重现 data data