DownloadManager IllegalStateException 在 DIRECTORY_DOWNLOADS 中创建下载

Posted

技术标签:

【中文标题】DownloadManager IllegalStateException 在 DIRECTORY_DOWNLOADS 中创建下载【英文标题】:DownloadManager IllegalStateException creating a download in DIRECTORY_DOWNLOADS 【发布时间】:2016-04-28 18:59:40 【问题描述】:

首先,关于这个主题有很多问题,但没有一个反映我的问题。例如,我读过this 和this。

我遇到的问题是,在极少数情况下,我对setDestinationInExternalPublicDir 的函数会导致以下堆栈跟踪:

Fatal Exception: java.lang.RuntimeException: Unable to start receiver com.onlinetvrecorder.otrapp2.listeners.DownloadUpdateReceiver: java.lang.IllegalStateException: Unable to create directory: /mnt/sdcard/Download
       at android.app.ActivityThread.handleReceiver(ActivityThread.java:2274)
       at android.app.ActivityThread.access$1500(ActivityThread.java:131)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4791)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by java.lang.IllegalStateException: Unable to create directory: /mnt/sdcard/Download
       at android.app.DownloadManager$Request.setDestinationInExternalPublicDir(DownloadManager.java:496)
       at com.myapp.Utils.download(SourceFile:752)
       at com.myapp.Receiver.onReceive(SourceFile:20)
       at android.app.ActivityThread.handleReceiver(ActivityThread.java:2267)
       at android.app.ActivityThread.access$1500(ActivityThread.java:131)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:137)
       at android.app.ActivityThread.main(ActivityThread.java:4791)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
       at dalvik.system.NativeStart.main(NativeStart.java)

我使用标准的Environment 常量来告诉DownloadManager 将文件保存在哪里。

android.app.DownloadManager dm = (android.app.DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

DownloadManager.Request request = new DownloadManager.Request(Uri.parse("url.to.file.ext"));
request.setMimeType("mime/type");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
    Utils.setDownloadRequestVisibility(request, android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);


request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "file.ext");
request.setTitle(context.getString(R.string.download));

dm.enqueue(request);

如前所述,可能甚至没有 1% 的用户遇到此错误。可能是什么原因造成的?

【问题讨论】:

【参考方案1】:

在写我的问题的过程中,我注意到我可能刚刚自己解决了这个问题。我打算写出有问题的设备型号是什么,但在 Crashlytics 上它显示为“未知”。我点击了它,然后显示了以下模型:GI I9500 TMMARS。运行 Android 4。

TMMARS 似乎是来自Trend Micro 的软件。

趋势科技移动应用信誉服务或 TMMARS 是基于云的 基于应用程序自动识别移动威胁的服务 行为。

系统的行为极有可能与应用程序的预期不符,仅仅是因为它是一个威胁检测环境。

崩溃报告示例:

【讨论】:

嘿,感谢您写下这个问题,然后花时间自己回答。我希望更多的人这样做来分享知识。不过,问题是:我们的移动应用程序也收到了其中的一小部分。您知道这是一项自动在 Play 商店上运行应用程序的软件服务,还是试图破解应用程序的恶意用户,或者是试图测试应用程序安全性的潜在客户?谢谢! 它可能是所有的东西。实在是没法说。型号名称只是一个指标,如果他们费心制作自己的固件来测试漏洞,有人可能会对其进行欺骗。最好的办法是解决他们发现的问题或忽略它们。

以上是关于DownloadManager IllegalStateException 在 DIRECTORY_DOWNLOADS 中创建下载的主要内容,如果未能解决你的问题,请参考以下文章

Downloadmanager实现app实现的升级下载使用

DownloadManager的使用

Android中的文件下载——DownLoadManager

如何使用 DownloadManager 将下载的文件存储到应用程序分配的文件目录中?

DownloadManager不好用?试试ZlsamDownloadService

从 DownloadManager 打开下载的文件时如何修复 CursorIndexOutOfBoundsException? [复制]