我当前正在创建一个应用,该应用需要下载一些视频,然后将其本地路径保存在SQLite
数据库中。
起初,我想获得下载的视频的URL
,但似乎找不到任何讨论的内容。我试图从传递给COLUMN_MEDIAPROVIDER_URI
的{{1}}的意图中获取COLUMN_URI
和BroadcastReceiver
,但是它们返回null。
然后我发现了DownloadManager.ACTION_DOWNLOAD_COMPLETE
。但是,如果我使用它,我仍然需要使用新的EXTRA_DOWNLOAD_ID
之类的东西来下载我的文件HashMap
和我的EXTRA_DOWNLOAD_ID
数据库中的视频ID,以检查哪个是哪个
我很好,但是我想知道是否有更简单的方法来做我想要的事情。
答案 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,因此我可以重新下载视频并修复间隔并在下次播放时播放本地文件。视频需要播放。