DownloadManager IllegalStateException, создающий загрузку в DIRECTORY_DOWNLOADS

Во-первых, вопросов на эту тему много, но ни один не отражает мою проблему. Например, я прочитал это и это.

Проблема, с которой я столкнулся, заключается в том, что в чрезвычайно случаях моя функция 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% пользователей получают эту ошибку. Что может быть причиной этого?


person Knossos    schedule 22.01.2016    source источник


Ответы (1)


В ходе написания моего вопроса я заметил, что, вероятно, только что сам решил проблему. Я собирался написать модель устройства, нарушившего правила, но на Crashlytics высветилось «Неизвестно». Я нажал на это, и открылась следующая модель: GI I9500 TMMARS. Работает Андроид 4.

Похоже, что TMMARS — это программное обеспечение от Trend Micro.

Служба репутации мобильных приложений Trend Micro или TMMARS — это облачная служба, которая автоматически выявляет мобильные угрозы на основе поведения приложений.

Крайне вероятно, что система ведет себя не так, как ожидает приложение, просто потому, что это среда обнаружения угроз.

Пример отчета о сбое:

пример отчета о сбое из  Crashlytics

person Knossos    schedule 22.01.2016
comment
Эй, спасибо, что написали этот вопрос, а затем нашли время ответить на него самостоятельно. Я бы хотел, чтобы больше людей делали это, чтобы делиться знаниями. Однако вопрос: наше мобильное приложение также получает небольшое их количество. Знаете ли вы, это программная служба, которая автоматически запускает приложения в Play Store, или это может быть злонамеренный пользователь, пытающийся взломать приложение, или потенциальный клиент, пытающийся проверить безопасность приложения? Спасибо! - person Joshua Pinter; 02.04.2018
comment
Это может быть все что угодно. Это невозможно сказать. Название модели является лишь индикатором, кто-то может подделать его, если удосужится сделать собственную прошивку для тестирования эксплойтов. Лучше всего исправить проблемы, которые они найдут, или просто проигнорировать их. - person Knossos; 03.04.2018