当前位置: 首页 > 知识库问答 >
问题:

如何接收下载管理器意图的状态,直到下载成功或失败

盖锐
2023-03-14

这是我的问题。我正试图通过Asynctask使用download manager intent从服务器下载文件。在我的asynctask类的doInBackground中,我调用download manager intent,当下载完成(成功或失败)时,doInBackground将返回布尔值。这是我的密码

  protected Boolean doInBackground(String... f_url) {
        boolean flag = true;
        boolean downloading =true;
        try{
            DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);            
                           Request mRqRequest = new Request(
                                   Uri.parse("http://"+model.getDownloadURL()));
                           long idDownLoad=mManager.enqueue(mRqRequest);
                           DownloadManager.Query query = null;
                           query = new DownloadManager.Query();
                           Cursor c = null;
                             if(query!=null) {
                                        query.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_SUCCESSFUL|
                                                DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING);                                         
                             } else {
                        return flag;
                            }
                             c = mManager.query(query);
                                if(c.moveToFirst()) { 
            int status =c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 


                               while (downloading)
                               {    Log.i ("FLAG","Downloading");
                                   if (status==DownloadManager.STATUS_SUCCESSFUL)
                                   {    Log.i ("FLAG","done");
                                       downloading = false;
                                       flag=true;
                                       break;      
                                   }
                                   if (status==DownloadManager.STATUS_FAILED)
                                   {Log.i ("FLAG","Fail");
                                       downloading = false;
                                       flag=false;
                                      break;
                                   }
                       c.moveToFirst();
                               }
        }
                            return flag;
        }
        catch (Exception e)
        {
             flag = false;
                return flag;
        }    
    }

但DownloadManager状态永远不会跳到DownloadManager上。状态\u成功或下载管理器。你失败了。

共有3个答案

商宏爽
2023-03-14

以异步方式下载管理器下载文件。所以不需要将下载管理器放入Asynasks中。

如果下载完成,您可以使用接收器获取下载管理器的状态。

    public class CheckDownloadComplete extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

         String action = intent.getAction();
            if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) 
            {
                DownloadManager.Query query = new DownloadManager.Query();
                query.setFilterById(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0));
                DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                Cursor cursor = manager.query(query);
                if (cursor.moveToFirst()) {
                    if (cursor.getCount() > 0) {

                        int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                        Long download_id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,0);

                        // status contain Download Status
                        // download_id contain current download reference id

                        if (status == DownloadManager.STATUS_SUCCESSFUL)
                        {
                            String file = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));

                            //file contains downloaded file name

                            // do your stuff here on download success

                        } 
                    }
                }
                cursor.close();
            }   
    }
}

别忘了在舱单中添加收件人

  <receiver
        android:name=".CheckDownloadComplete"
        android:enabled="true"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
        </intent-filter>
    </receiver>
段铭晨
2023-03-14

您必须重新询问下载管理器。即使数据发生变化,光标也保持不变。试着这样做:

protected Boolean doInBackground(String... f_url) {
    boolean flag = true;
    boolean downloading =true;
    try{
        DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);            
        Request mRqRequest = new Request(
        Uri.parse("http://"+model.getDownloadURL()));
        long idDownLoad=mManager.enqueue(mRqRequest);
        DownloadManager.Query query = null;
        query = new DownloadManager.Query();
        Cursor c = null;
        if(query!=null) {
            query.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_SUCCESSFUL|DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING);                                         
        } else {
            return flag;
        }

        while (downloading) {
            c = mManager.query(query);
            if(c.moveToFirst()) { 
                Log.i ("FLAG","Downloading");
                int status =c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 

                if (status==DownloadManager.STATUS_SUCCESSFUL) {
                    Log.i ("FLAG","done");
                    downloading = false;
                    flag=true;
                    break;      
                }
                if (status==DownloadManager.STATUS_FAILED) {
                    Log.i ("FLAG","Fail");
                    downloading = false;
                    flag=false;
                    break;
                }
            }
        }

        return flag;
    }catch (Exception e) {
        flag = false;
        return flag;
    }    
}
范彭亮
2023-03-14

不需要Async任务或同步查询。DownloadManager已经是异步的。您应该为ACTION_DOWNLOAD_COMPLETE注册一个BroadcastRecencer,以便在下载完成(或失败)时收到通知。

http://blog.vogella.com/2011/06/14/android-downloadmanager-example有一个很好的例子

 类似资料:
  • 我对API请求有一个奇怪的问题。问题是使用或浏览器时,我使用的url工作正常。但使用异步服务程序时,URL会失败并返回状态代码404。 下面是我的代码:我已经构建了一个异步下载函数: 注意:令牌将过期。 使用很好。但使用我自己的函数会产生: 使用my功能下载其他内容也很好。 那么有人知道为什么服务器在尝试异步访问时返回404吗? 我之前的问题被关闭了,因为你们中的一些人认为这是一个类似的问题:但是

  • 因此,在下载和打开文件之间的某个位置,我需要一个if语句来检查它是应该继续还是等待文件。

  • 我正在尝试下载一个文件到目录,可以根据用户选择的任何目录变化。我将当前目录存储在一个file对象中,现在正在尝试下载该文件。文件下载,但它不下载指定的目录。那么,我可以做什么来获得所选目录中的文件。 传递给文件构造函数的名为url的字符串包含url。只是用它来检索文件名。 更新:我刚找到文件。它在手机里而不是sd卡里。它就在这个文件夹里,存储\仿真\00。不知道为什么?另外,我得到的绝对路径是St

  • 比如说,我正在开发一个聊天应用程序,可以与其他人共享任何类型的文件(没有mimetype限制):比如图像、视频、文档,但也可以共享压缩文件,比如zip、rar、apk,或者更不常见的文件类型,比如photoshop或autocad文件。 在Android9或更低版本中,我直接将这些文件下载到下载目录,但在Android10中,如果不向用户显示下载它们的意图,就不可能做到这一点。。。 不可能的但为什

  • 问题内容: 我想从网址下载二进制文件。是否可以使用我在DownloadManager类中找到的Android下载管理器类? 问题答案: 是否可以使用我在这里找到的android下载管理器类 是的,尽管仅从Android API级别9(版本2.3)开始可用。这是一个示例项目,演示的使用。

  • 控制从远程源的文件下载。 进程: 主进程​ DownloadItem(下载项)是一个在Electron中展示下载项的EventEmitter​ 它被用于 Session类中的 will-download事件,并允许用户控制下载项。 1 //主进程中 2 const {BrowserWindow} = require('electron') 3 let win = new BrowserWindow