在我的应用程序中,我从服务器下载电影.其中一些非常大(4gb或更多).我试图将我自己的下载管理器作为一项服务实现,但它并没有放弃.在某些设备上,应用程序只是在没有任何通知的情况下崩溃,整体下载似乎太慢了.
所以,我想使用Android的默认DownloadManager,但我唯一的问题是我无法暂停/恢复它.
有没有办法实现呢?
我想从我的服务器下载一个大(zip)文件.它大约是440MB.我正在使用android下载服务.
这是我的代码:
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Request request = new Request(Uri.parse(SERVER_PATH));
request.setTitle(getString(R.string.title_download));
request.setDescription(getString(R.string.desc_download));
File mapDir = new File(Environment.getExternalStorageDirectory() + DEVICE_PATH_PART);
File mapPartFile = new File(Environment.getExternalStorageDirectory() + DEVICE_PATH_PART + MAP_PACKFILE + EXT_INPROGRESS);
request.setDestinationUri(Uri.fromFile(mapPartFile));
enqueue = dm.enqueue(request);
Run Code Online (Sandbox Code Playgroud)
下载开始很好.我可以在下载管理器中看到我的文件.但是当出现一些网络问题(连接中断)时,下载完成,错误1008,部分文件从我的目录中删除.这是我的问题和疑问: 如何强制下载服务不从目标目录中删除部分文件,以便恢复下载过程?
方面的问题或问题是:当我从我的应用程序下载440meg文件时,下载过程多次中断(无法恢复错误,之后无法恢复下载).但是,如果我直接在android中通过下载管理器应用程序下载相同的文件,一切都很好.我不知道为什么.我在接收器中遇到的唯一错误是1008关于恢复无法恢复.有没有人有同样的问题?
谢谢.
目前我使用下面的代码片段来下载文件DownloadManager:
String servicestring = Context.DOWNLOAD_SERVICE;
DownloadManager downloadmanager;
downloadmanager = (DownloadManager) getSystemService(servicestring);
Uri uri = Uri
.parse("some url here");
DownloadManager.Request request = new Request(uri);
Run Code Online (Sandbox Code Playgroud)
使用此代码我收到以下通知.

我的问题是,我们可以在此通知中添加一些交叉按钮,以便如果用户单击该按钮它将取消下载吗?
预期产量:
(单击此红叉图标时,用户必须能够取消下载)
如果有的话,请提出一些建议.谢谢
我需要以这种形式为我的应用程序创建一个动态下载管理器:
从自定义列表中删除完整下载
像这样 
起初我使用此站点代码进行线程下载.
然后,我创建一个自定义列表视图,每次用户单击"下载"按钮时,将添加该下载链接.
但我有两个问题:
现在,问题是:我如何为我的应用程序创建一个动态下载管理器,可以添加具有暂停/恢复功能的列表的新链接,并从自定义列表中删除下载的项目?
编辑 - 添加Custom-Listview
我在此链接中的自定义列表视图:https://github.com/saeid-pm/Custom-Listview
我正在使用Android中的DownloadManager服务通过https网址下载文件,例如https://www.antennahouse.com/XSLsample/pdf/sample-link_1.pdf.这些文件不受(当前)密码保护,以防万一.
一旦我将下载请求排入队列,DownloadManager就会开始下载,但它似乎挂起了.当我检查状态时,我明白了
COLUMN_BYTES_DOWNLOADED_SO_FAR: 0
COLUMN_STATUS: 4
COLUMN_REASON: 1
Run Code Online (Sandbox Code Playgroud)
COLUMN_STATUS 4是STATUS_PAUSED,"当下载等待重试或恢复时."
COLUMN_REASON 1是PAUSED_WAITING_TO_RETRY,"当下载暂停时,因为发生了一些网络错误并且下载管理器在重试请求之前正在等待." 但似乎没有办法确定发生了什么网络错误.下载永远不会成功完成.
我已经检查了logcat监视器是否有相关的警告和错误,但一无所获.
我已尝试使用多个不同的服务器,包括内部和公共服务器,结果相同.
没有明显的网络问题:Wi-Fi连接已启动,使用http://下载正常工作:文件立即下载并显示在指定目标的文件系统中.
在https下载的情况下,我们的服务器日志显示从服务器的角度成功提供文件.在笔记本电脑上的浏览器中测试相同的https URL会导致成功下载文件,而不会出现任何明显的问题或在开发人员工具网络面板中显示额外的协商.
我的代码(摘要):
sManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request req = new DownloadManager.Request(sourceURI);
final Uri destinationUri = Uri.fromFile(destinationFile);
req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI
| DownloadManager.Request.NETWORK_MOBILE)
.setDestinationUri(destinationUri)
.setMimeType(...);
long id = sManager.enqueue(req);
Run Code Online (Sandbox Code Playgroud)
简介:通过DownloadManager启动的https下载无限期挂起,而相同的https下载在浏览器中正常工作,并且普通的http下载可以使用DownloadManager在同一个应用程序中正常工作.我有的最好的线索是PAUSED_WAITING_TO_RETRY表示"发生了一些网络错误".如何确定网络错误是什么?
我尝试使用DownloadManager执行下载文件.除LG设备外一切正常.这是我的代码:
private void downloadFile(FileInfo fileInfo) {
private DownloadManager manager = (DownloadManager) MyApp.getSingleton().
getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://"
+ MyPreference.getInstance().getBaseUrl()
+ "/api/v3/files/"
+ fileId
+ "/get"));
request.setDescription(MyApp.getSingleton().getApplicationContext().getString(R.string.downloading));
request.setTitle(fileInfo.getmName());
request.addRequestHeader("Authorization", "Bearer " + MyPreference.getInstance().getAuthToken());
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
File dir = new File(FileUtil.getInstance().getDownloadedFilesDir());
if(!dir.exists()){
dir.mkdirs();
}
request.setDestinationUri(Uri.fromFile(new File(FileUtil.getInstance().getDownloadedFilesDir() + File.separator + fileInfo.getmName())));
downloadId = manager.enqueue(request);
new Thread(() -> {
boolean downloading = true;
while (downloading) {
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadId);
Cursor cursor = manager.query(q);
cursor.moveToFirst();
int bytes_downloaded = 0;
long …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,有一些用户可以下载的文件.文件通过android下载管理器下载.但是,几周以来,数百名用户一直在抱怨他们的文件每8-12天自动删除一次,甚至没有他们卸载应用程序.(可能会有更多用户不愿意抱怨同样的问题.)
现在,可能存在许多用户特定的原因,为什么会在少数设备上发生这种情况.但考虑到大量的用户,似乎我可能做错了什么.
为什么系统/下载管理器会自动删除文件?有没有办法通知系统或下载管理器不删除某些文件?或者我应该在下载后重新命名文件,以便将它们与下载管理器取消链接,并希望问题能够解决?
编辑:
这是我用来下载文件的代码:
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(trackLink));
request.setTitle(trackTitle);
request.setDestinationInExternalPublicDir("Tracks", trackTitle + ".mp3");
request.setVisibleInDownloadsUi(false);
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
Run Code Online (Sandbox Code Playgroud) 我使用 DownloadManager 下载照片并将其保存到外部图片目录:
.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, File.separator + filename)
Run Code Online (Sandbox Code Playgroud)
Marshmallow 需要 WRITE_EXTERNAL_STORAGE(如预期),但在 Android Q 及更高版本上,它无需许可即可正常工作。为什么会这样?是因为范围存储吗?
android android-permissions android-download-manager android-external-storage scoped-storage
我想在Android 10上使用DownloadManager下载文件,会出现下载进度通知栏。
我使用如下代码,在Android 9下的设备上可以正常使用,但在Android 10模拟器上不能使用(没有出现错误异常信息)。下载进度通知栏没有出现在通知栏上,但我注意到这个文件出现在系统的“文件”应用程序中并且没有被下载,因为它的原始大小(字节)总是-1。
如何修改我的代码,使其可以在Android 10上使用,非常感谢!
var request = DownloadManager.Request(Uri.parse(downloadUrl))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, saveName)
} else {
request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, saveName)
}
request.setAllowedNetworkTypes(
DownloadManager.Request.NETWORK_MOBILE or DownloadManager.Request.NETWORK_WIFI
)
request.setNotificationVisibility(
DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED
)
request.setTitle("TEST")
request.setDescription("TEST")
downloadManager.enqueue(request)
Run Code Online (Sandbox Code Playgroud)
从测试结果来看,这个问题可能是模拟器的一个bug,因为我没有在真机(三星s10、三星note9、小米8、谷歌nexus6P)上测试过这个问题,但是我没有更多真机,所以如果你其他真实设备有这个问题,请告诉我。
我正在尝试在 exoplayer 中离线下载视频,我想在活动中显示下载进度。
我如何绑定到DownloadServicein exoplayer。以便我可以更新活动中的当前下载进度?我尝试覆盖onBind方法,但没有onBind方法。
下载服务
class MediaDownloadService : DownloadService(
C.DOWNLOAD_NOTIFICATION_ID, 1000,
C.CHANNEL_ID, R.string.channel_name, R.string.channel_description
) {
private lateinit var downloadManager: DownloadManager
override fun onCreate() {
downloadManager = DownloadUtil.getDownloadManager(this)
downloadManager.addListener(object : DownloadManager.Listener {
override fun onDownloadChanged(downloadManager: DownloadManager, download: Download) {
if (download.bytesDownloaded == download.contentLength) {
toast("Download Completed!")
}
debug(download.failureReason)
}
})
super.onCreate()
}
override fun getDownloadManager(): DownloadManager {
return downloadManager
}
override fun getForegroundNotification(downloads: MutableList<Download>): Notification {
val intent = Intent(this, MainActivity::class.java)
val pendingIntent …Run Code Online (Sandbox Code Playgroud)