有没有更简单的方法来检查哪个下载已经完成?

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

我目前正在创建一个需要下载几个视频然后将其本地路径保存在 SQLite 数据库中的应用程序。

起初,我想得到我下载的视频的URL,但我似乎找不到任何关于它的讨论。我试图从 BroadcastReceiver 上传递给 DownloadManager.ACTION_DOWNLOAD_COMPLETE 的意图中获取 COLUMN_MEDIAPROVIDER_URICOLUMN_URI,但它们 return 为空。

然后我找到了大约EXTRA_DOWNLOAD_ID。但是如果我使用它,我仍然需要使用像新的 HashMap 这样的东西,它获得了我下载的 EXTRA_DOWNLOAD_ID 和我的 SQLite 数据库中的视频 ID 来检查哪个是哪个.

我没意见,但我想知道是否有更简单的方法来完成我想做的事情。

我是用 OkHttp 做的,如下:

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(YOUR_URL)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                    // ERROR MESSAGE
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    response.body().byteStream(); // byteStream with your result.
                }
            }
        });

另一件事,如果您将视频存储在内存中并且仅将地址存储在您的 SQLite 中,可能会更好。

使用下面来自 SO 问题的代码

@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();
    }
}

并将下载 ID 保存在我的 ArrayList 上,我可以用更简单的方法来检查哪个下载已完成。

我针对我的用例将其修改为如下所示。

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 :(");
}

更新:

有时此方法会显示 2 次下载完成时使用相同的文件名,这会导致视频项目没有本地路径。我做的是检查本地路径是否为空,下载id是否大于0,如果下载id在播放视频之前还在下载,那么我可以重新下载视频并修复差距并在下次播放本地文件需要播放视频。