使用Android自带DownloadManager下载文件

本文介绍了在Android应用中利用DownloadManager服务进行高效下载管理的方法,包括实例代码演示及权限需求,展示了如何通过代码实现自动下载、状态监控及错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SDK在API Level 9中加入了DownloadManager服务,可以将长时间的下载任务交给系统,完全由系统管理。

直接看实例代码:
[java] view plain copy
  1. packagecom.hebaijun.downloadtest;
  2. importjava.io.UnsupportedEncodingException;
  3. importjava.net.URLEncoder;
  4. importandroid.app.Activity;
  5. importandroid.app.DownloadManager;
  6. importandroid.app.DownloadManager.Request;
  7. importandroid.content.BroadcastReceiver;
  8. importandroid.content.Context;
  9. importandroid.content.Intent;
  10. importandroid.content.IntentFilter;
  11. importandroid.content.SharedPreferences;
  12. importandroid.database.Cursor;
  13. importandroid.net.Uri;
  14. importandroid.os.Bundle;
  15. importandroid.preference.PreferenceManager;
  16. importandroid.util.Log;
  17. importandroid.webkit.MimeTypeMap;
  18. publicclassDownloadTestActivityextendsActivity{
  19. privateDownloadManagerdownloadManager;
  20. privateSharedPreferencesprefs;
  21. privatestaticfinalStringDL_ID="downloadId";
  22. /**Calledwhentheactivityisfirstcreated.*/
  23. @Override
  24. publicvoidonCreate(BundlesavedInstanceState){
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. downloadManager=(DownloadManager)getSystemService(DOWNLOAD_SERVICE);
  28. prefs=PreferenceManager.getDefaultSharedPreferences(this);
  29. }
  30. @Override
  31. protectedvoidonPause(){
  32. //TODOAuto-generatedmethodstub
  33. super.onPause();
  34. unregisterReceiver(receiver);
  35. }
  36. @Override
  37. protectedvoidonResume(){
  38. //TODOAuto-generatedmethodstub
  39. super.onResume();
  40. if(!prefs.contains(DL_ID)){
  41. Stringurl="http://10.0.2.2/android/film/G3.mp4";
  42. //开始下载
  43. Uriresource=Uri.parse(encodeGB(url));
  44. DownloadManager.Requestrequest=newDownloadManager.Request(resource);
  45. request.setAllowedNetworkTypes(Request.NETWORK_MOBILE|Request.NETWORK_WIFI);
  46. request.setAllowedOverRoaming(false);
  47. //设置文件类型
  48. MimeTypeMapmimeTypeMap=MimeTypeMap.getSingleton();
  49. StringmimeString=mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url));
  50. request.setMimeType(mimeString);
  51. //在通知栏中显示
  52. request.setShowRunningNotification(true);
  53. request.setVisibleInDownloadsUi(true);
  54. //sdcard的目录下的download文件夹
  55. request.setDestinationInExternalPublicDir("/download/","G3.mp4");
  56. request.setTitle("移动G3广告");
  57. longid=downloadManager.enqueue(request);
  58. //保存id
  59. prefs.edit().putLong(DL_ID,id).commit();
  60. }else{
  61. //下载已经开始,检查状态
  62. queryDownloadStatus();
  63. }
  64. registerReceiver(receiver,newIntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
  65. }
  66. /**
  67. *如果服务器不支持中文路径的情况下需要转换url的编码。
  68. *@paramstring
  69. *@return
  70. */
  71. publicStringencodeGB(Stringstring)
  72. {
  73. //转换中文编码
  74. Stringsplit[]=string.split("/");
  75. for(inti=1;i<split.length;i++){
  76. try{
  77. split[i]=URLEncoder.encode(split[i],"GB2312");
  78. }catch(UnsupportedEncodingExceptione){
  79. e.printStackTrace();
  80. }
  81. split[0]=split[0]+"/"+split[i];
  82. }
  83. split[0]=split[0].replaceAll("\\+","%20");//处理空格
  84. returnsplit[0];
  85. }
  86. privateBroadcastReceiverreceiver=newBroadcastReceiver(){
  87. @Override
  88. publicvoidonReceive(Contextcontext,Intentintent){
  89. //这里可以取得下载的id,这样就可以知道哪个文件下载完成了。适用与多个下载任务的监听
  90. Log.v("intent",""+intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,0));
  91. queryDownloadStatus();
  92. }
  93. };
  94. privatevoidqueryDownloadStatus(){
  95. DownloadManager.Queryquery=newDownloadManager.Query();
  96. query.setFilterById(prefs.getLong(DL_ID,0));
  97. Cursorc=downloadManager.query(query);
  98. if(c.moveToFirst()){
  99. intstatus=c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
  100. switch(status){
  101. caseDownloadManager.STATUS_PAUSED:
  102. Log.v("down","STATUS_PAUSED");
  103. caseDownloadManager.STATUS_PENDING:
  104. Log.v("down","STATUS_PENDING");
  105. caseDownloadManager.STATUS_RUNNING:
  106. //正在下载,不做任何事情
  107. Log.v("down","STATUS_RUNNING");
  108. break;
  109. caseDownloadManager.STATUS_SUCCESSFUL:
  110. //完成
  111. Log.v("down","下载完成");
  112. break;
  113. caseDownloadManager.STATUS_FAILED:
  114. //清除已下载的内容,重新下载
  115. Log.v("down","STATUS_FAILED");
  116. downloadManager.remove(prefs.getLong(DL_ID,0));
  117. prefs.edit().clear().commit();
  118. break;
  119. }
  120. }
  121. }
  122. }

最后需要的权限是:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果需要隐藏下载工具的提示和显示,修改代码:
request.setShowRunningNotification(false);
request.setVisibleInDownloadsUi(false);
加入下面的权限:
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>

http://blog.youkuaiyun.com/lixiang0522/article/details/7608310
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值