【问题标题】:Show progress dialog while DownloadManager is downloading?DownloadManager 正在下载时显示进度对话框?
【发布时间】:2014-04-27 09:28:18
【问题描述】:

我有一个可以下载多个文件的下载管理器。如何在管理器开始第一个请求时显示进度对话框,并在最后一个请求完成下载后关闭对话框?

我猜我需要使用 ACTION_DOWNLOAD_COMPLETE 进行检查,但我不确定如何实现它。感谢您的帮助。

【问题讨论】:

    标签: java android android-download-manager


    【解决方案1】:

    这是我编写的一些实用程序代码,用于使用 DownloadManager 执行下载并将结果传递给回调

    public static void downloadPdf(Context context, String url, String name, final Callback callback){
        Uri uri;
        try{
            uri = Uri.parse(url);
        }
        catch(Exception e){
            Log.e(LogTags.UI, "Error parsing pdf url " + url, e);
            callback.onError();
            return;
        }
    
        DownloadManager.Request r = new DownloadManager.Request(uri);
    
        // This put the download in the same Download dir the browser uses
        r.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, name);
    
        // When downloading music and videos they will be listed in the player
        // (Seems to be available since Honeycomb only)
        r.allowScanningByMediaScanner();
    
        // Notify user when download is completed
        // (Seems to be available since Honeycomb only)
        r.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    
        // Start download
        final DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        final long downloadId = dm.enqueue(r);
    
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                    if(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0) != downloadId){
                        // Quick exit - its not our download!
                        return;
                    }
    
                    DownloadManager.Query query = new DownloadManager.Query();
                    query.setFilterById(downloadId);
                    Cursor c = dm.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c
                                .getColumnIndex(DownloadManager.COLUMN_STATUS);
                        if (DownloadManager.STATUS_SUCCESSFUL == c
                                .getInt(columnIndex)) {
    
                            String uriString = c
                                    .getString(c
                                            .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                            Uri uri = Uri.parse(uriString);
    
                            intent = new Intent();
                            intent.setAction(Intent.ACTION_VIEW);
                            intent.setDataAndType(uri, "application/pdf");
    
                            callback.onSuccess();
    
                            context.startActivity(intent);
    
                        }
                        else{
                            callback.onError();
                        }
                    }
                    else{
                        callback.onError();
                    }
                    context.unregisterReceiver(this);
                }
            }
        };
    
        context.registerReceiver(receiver, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }
    

    您可以在回调中执行您想要的任何 UI 工作 - 在我的情况下,我在开始下载之前启动了一个不确定的进度对话框,然后在完成时将其隐藏:

        String filename =  "Some Notes.pdf";
        final ProgressDialog dialog = ProgressDialog.show(this,
                "Downloading PDF",
                "Donwloading " + filename, true, true);
    
       downloadPdf(this,
                "http://some-url.com/with_pdf.pdf",
                filename,
                new Callback() {
                    @Override
                    public void onSuccess() {
                        dialog.dismiss();
                    }
    
                    @Override
                    public void onError() {
                        dialog.dismiss();
                    }
                });
    

    PS。我正在使用有用的毕加索库中的回调接口 - 您可以轻松定义自己的接口,它只有两个 onSuccess 和 onError 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多