Search code examples
androidandroid-download-manager

Is there a simpler way to check which download has been completed?


I'm currently creating an app that needs to download a couple of videos then save the local path of it on a SQLite database.

At first, I wanted to get the URL of the video I downloaded but I can't seem to find anything that discusses about it. I tried to get COLUMN_MEDIAPROVIDER_URI and COLUMN_URI from the intent passed on the BroadcastReceiver for DownloadManager.ACTION_DOWNLOAD_COMPLETE but they return null.

Then I found about EXTRA_DOWNLOAD_ID. But if I use that, I still need to use something like a new HashMap that got the EXTRA_DOWNLOAD_ID of my download and the id of the video on my SQLite database for checking which is which.

I'm fine with that but I want to know if there's an easier way to do the thing I want.


Solution

  • Using the code below from the SO question here

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
    
            // get the DownloadManager instance
            DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    
            DownloadManager.Query q = new DownloadManager.Query();
            Cursor c = manager.query(q);
    
            if(c.moveToFirst()) {
                do {
                    String name = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
                    Log.i("DOWNLOAD LISTENER", "file name: " + name);
                } while (c.moveToNext());
            } else {
                Log.i("DOWNLOAD LISTENER", "empty cursor :(");
            }
    
            c.close();
        }
    }
    

    and saving the download id on my ArrayList I was able to make a simpler way to check which download is finished.

    I modified it to look like this for my use case.

    Cursor c = dlMgr.query(new DownloadManager.Query());
    boolean found = false;
    
    if(c.moveToFirst()) {
        do {
            String dlFilePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
            int dlId = Integer.parseInt( c.getString(c.getColumnIndex(DownloadManager.COLUMN_ID)) );
    
            for(int x = 0; x < vidArrLst.size(); x++){
                VideoAd va = vidArrLst.get(x);
                if(va.getDownloadId() == dlId){
                    dbHelper.updateLocalPath(va.getVideoId(), dlFilePath);
    
                    va.setLocalPath(dlFilePath);
                    found = true;
                    break;
                }
            }
    
        } while (c.moveToNext() && !found);
    } else {
        Log.d(TAG, "empty cursor :(");
    }
    

    UPDATE:

    Sometimes this method will show that 2 downloads finished with the same file name which results to a video item to not have a local path. What I did is check if the local path is empty, download id is greater than 0, and if the download id is still downloading before playing a video so I can redownload a video and fix the gap and play the local file the next time the video needs to be played.