茉莉清梦 發表於 2020-7-14 16:46:00

Android开发 下载管理器DownloadManager详解

<h1><span style="color: rgba(0, 128, 128, 1)">版权声明</span></h1>
<p>本文来自博客园,作者:观心静&nbsp;,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/13299949.html</p>
<div>本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。</div>
<h1><span style="color: rgba(0, 128, 128, 1)">前言</span></h1>
<p>  DownloadManager是Android系统自带的下载管理工具,此工具可以很好的调度好下载。在没有特殊需求的情况下,一般是推荐使用此工具下载的。另外这个工具下载还有有优势就是可以在下载app完成后直接跳转到安装页面。</p>
<p>  参考:https://www.jianshu.com/p/e0496200769c</p>
<h1><span style="color: rgba(0, 128, 128, 1)">需要的权限</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)">需要网络权限和文件读写权限</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">uses-permission </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.permission.WRITE_EXTERNAL_STORAGE"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">uses-permission </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.permission.INTERNET"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)">请求安装包权限</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">uses-permission </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.permission.REQUEST_INSTALL_PACKAGES"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span></pre>
</div>
<p>&nbsp;</p>
<h1><span style="color: rgba(0, 128, 128, 1)">创建</span><span style="color: rgba(0, 128, 128, 1)">下载请求</span></h1>
<div>
<pre class="language-java highlighter-hljs" data-dark-theme="true"><code>fun downloadApp(downloadUrl: String) : Long{
    val request = DownloadManager.Request(Uri.parse(downloadUrl))
    val downloadsDir = AppHelper.I().app.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
    request.setDestinationUri(Uri.fromFile(File(downloadsDir, "YTHOME.apk")))
    request.setTitle("下载测试")
    request.setDescription(AppHelper.I().app.getString(R.string.main_please_wait))
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE or DownloadManager.Request.NETWORK_WIFI) //设置下载的网络类型
    request.setVisibleInDownloadsUi(true)
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    return mDownloadManager.enqueue(request)
}</code></pre>
</div>
<p>加入列队后,下载就进行了。我们可以在下拉通知栏里看到正在下载的文件。</p>
<p>另外<span style="color: rgba(0, 0, 0, 1)">注意 setDestinationInExternalPublicDir方法已经包含根目录路径了,所以直接传入DIRECTORY_DOWNLOADS就可以了,千万不要在导入一个 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() 这样他会自动在创建多层目录</span></p>
<h1><span style="color: rgba(0, 128, 128, 1)">查询即将保存的下载文件路径与文件名称</span></h1>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> queryFileName(<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> id){
      DownloadManager downloadManager </span>= (DownloadManager) MainActivity.<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getApplication().getSystemService(Context.DOWNLOAD_SERVICE);
      DownloadManager.Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DownloadManager.Query();
      query.setFilterById(id);
      Cursor cursor </span>=<span style="color: rgba(0, 0, 0, 1)"> downloadManager.query(query);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (cursor.moveToFirst()) {
            String file </span>=<span style="color: rgba(0, 0, 0, 1)"> cursor.getString(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));
            Log.e(</span>"调试_临时_log", "this_" +<span style="color: rgba(0, 0, 0, 1)"> file);
      }
    }</span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">监听下载状态</span></h1>
<div class="cnblogs_code">
<pre>                AppDownReceiver appDownReceiver = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AppDownReceiver();
                registerReceiver(appDownReceiver, </span><span style="color: rgba(0, 0, 255, 1)">new</span> IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));</pre>
</div>
<p>&nbsp;广播部分代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> DownloadReceiver <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> BroadcastReceiver {
    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onReceive(Context context, Intent intent) {
      String action </span>=<span style="color: rgba(0, 0, 0, 1)"> intent.getAction();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">TextUtils.equals(action, DownloadManager.ACTION_DOWNLOAD_COMPLETE)){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">long</span> downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (downloadId == -1<span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      DownloadManager downloadManager </span>=<span style="color: rgba(0, 0, 0, 1)"> (DownloadManager) context.getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE);
      </span><span style="color: rgba(0, 0, 255, 1)">int</span> status =<span style="color: rgba(0, 0, 0, 1)"> getDownloadStatus(downloadManager, downloadId);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (status != DownloadManager.STATUS_SUCCESSFUL){ <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">下载状态不等于成功就跳出</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      Uri uri </span>= downloadManager.getUriForDownloadedFile(downloadId);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取下载完成文件uri</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (uri == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 获取下载状态
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> downloadManager
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> downloadId
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
   <span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span> getDownloadStatus(DownloadManager downloadManager, <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> downloadId) {
      DownloadManager.Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DownloadManager.Query().setFilterById(downloadId);
      Cursor c </span>=<span style="color: rgba(0, 0, 0, 1)"> downloadManager.query(query);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (c != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (c.moveToFirst()) {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
                }
            } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
                c.close();
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1<span style="color: rgba(0, 0, 0, 1)">;
    }


}</span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">下载状态查询</span></h1>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 获取下载状态
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> downloadId an ID for the download, unique across the system.
   *                   This ID is used to make future calls related to this download.
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)"> int
   * </span><span style="color: rgba(128, 128, 128, 1)">@see</span><span style="color: rgba(0, 128, 0, 1)"> DownloadManager#STATUS_PENDING   下载等待开始时
   * </span><span style="color: rgba(128, 128, 128, 1)">@see</span><span style="color: rgba(0, 128, 0, 1)"> DownloadManager#STATUS_PAUSED      下载暂停
   * </span><span style="color: rgba(128, 128, 128, 1)">@see</span><span style="color: rgba(0, 128, 0, 1)"> DownloadManager#STATUS_RUNNING    正在下载中 
   * </span><span style="color: rgba(128, 128, 128, 1)">@see</span><span style="color: rgba(0, 128, 0, 1)"> DownloadManager#STATUS_SUCCESSFUL   下载成功
   * </span><span style="color: rgba(128, 128, 128, 1)">@see</span><span style="color: rgba(0, 128, 0, 1)"> DownloadManager#STATUS_FAILED       下载失败
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> getDownloadStatus(<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> downloadId) {
      DownloadManager.Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DownloadManager.Query().setFilterById(downloadId);
      Cursor c </span>=<span style="color: rgba(0, 0, 0, 1)"> downloadManager.query(query);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (c != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (c.moveToFirst()) {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
                }
            } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
                c.close();
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1<span style="color: rgba(0, 0, 0, 1)">;
    }</span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">下载进度查询</span></h1>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 获取当前下载进度
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
   <span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> getDownloadProgress() {
      DownloadManager.Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DownloadManager.Query().setFilterById(mDownloadId);
      Cursor c </span>=<span style="color: rgba(0, 0, 0, 1)"> mDownloadManager.query(query);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (c != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (c.moveToFirst()) {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> c.getInt(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                }
            } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
                c.close();
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1<span style="color: rgba(0, 0, 0, 1)">;

    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 获取下载总大小
   *
   * </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
   <span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> getDownloadTotal() {
      DownloadManager.Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DownloadManager.Query().setFilterById(mDownloadId);
      Cursor c </span>=<span style="color: rgba(0, 0, 0, 1)"> mDownloadManager.query(query);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (c != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (c.moveToFirst()) {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> c.getInt(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                }
            } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
                c.close();
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> -1<span style="color: rgba(0, 0, 0, 1)">;
    }</span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">安装下载完成的App</span></h1>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 安装apk
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> installApk(<span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> id) {
      Uri uri </span>=<span style="color: rgba(0, 0, 0, 1)"> mDownloadManager.getUriForDownloadedFile(id);
      Intent install </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Intent(Intent.ACTION_VIEW);
      install.setDataAndType(uri, </span>"application/vnd.android.package-archive"<span style="color: rgba(0, 0, 0, 1)">);
      install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK </span>|<span style="color: rgba(0, 0, 0, 1)"> Intent.FLAG_GRANT_READ_URI_PERMISSION);
      getApplication().startActivity(install);

    }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>END</p>

</div>
<div id="MySignature" role="contentinfo">
    <div style="text-align: center">
    <p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/13299949.html </p>
    <div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/13299949.html
頁: [1]
查看完整版本: Android开发 下载管理器DownloadManager详解