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

时间:2019-03-22 08:04:23

标签: android android-download-manager

我当前正在创建一个应用,该应用需要下载一些视频,然后将其本地路径保存在SQLite数据库中。

起初,我想获得下载的视频的URL,但似乎找不到任何讨论的内容。我试图从传递给COLUMN_MEDIAPROVIDER_URI的{​​{1}}的意图中获取COLUMN_URIBroadcastReceiver,但是它们返回null。

然后我发现了DownloadManager.ACTION_DOWNLOAD_COMPLETE。但是,如果我使用它,我仍然需要使用新的EXTRA_DOWNLOAD_ID之类的东西来下载我的文件HashMap和我的EXTRA_DOWNLOAD_ID数据库中的视频ID,以检查哪个是哪个

我很好,但是我想知道是否有更简单的方法来做我想要的事情。

2 个答案:

答案 0 :(得分:0)

我使用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中,则可能会更好。

答案 1 :(得分:0)

使用下面的SO问题here中的代码

<execution>

并将下载ID保存在我的ArrayList上,我能够以一种更简单的方式来检查哪个下载完成了。

我将其修改为适用于我的用例。

@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大于0,以及在播放视频之前是否仍在下载下载ID,因此我可以重新下载视频并修复间隔并在下次播放时播放本地文件。视频需要播放。