安卓Dailymotion视频下载器获取链接后无法下载报closed异常如何解决
问题原因
- 核心错误是Okio读取网络响应流时流已经被提前关闭,结合你的场景有四个触发原因:
- Dailymotion的资源链接有防盗链校验,请求未携带符合要求的
Referer、User-Agent请求头,服务器主动断开连接,返回流被提前关闭 - 代码中未提前创建目标存储目录,文件写入失败导致流被提前关闭
- 所用的Fast Android Networking库版本过旧,下载逻辑存在bug,遇到重定向或大文件响应时会提前关闭响应源
- 所使用的Dailymotion临时下载链接已经过期,服务器拒绝返回资源直接断开连接
- Dailymotion的资源链接有防盗链校验,请求未携带符合要求的
解决方案
按以下步骤修改即可解决:
- 补全防盗链校验所需请求头
下载请求必须添加Referer为https://www.dailymotion.com/,同时添加普通移动端浏览器的User-Agent头,绕过Dailymotion的防盗链校验。 - 提前创建存储目录
执行下载前先判断目标存储目录是否存在,不存在时先调用mkdirs()创建目录,同时确认应用已经获得所需的存储权限。 - 升级依赖库版本
将Fast Android Networking升级到最新稳定版,确保重定向跟随、大文件下载的逻辑正常。 - 确保下载链接有效
Dailymotion的签名临时链接有效期很短,下载时要使用刚解析到的新鲜链接,不要使用提前缓存的过期链接。
修改后的参考代码
private void download() { // 执行前请确认应用已经获得存储权限(安卓6.0+动态申请,安卓10+适配分区存储) String url = "https://proxy-25.sg1.dailymotion.com/sec" + "(dBG4yhTDGt8s-xJL9sczH_7xepHY7fASsEf--yb2hurT6QGlS77UybPsDxeGgwnIJAX0byvcREo9Wni" + "-vBKPqA)/video/773/458/493854377_mp4_h264_aac_ld.mp4"; // 建议用系统标准下载目录作为父目录,兼容性更好 File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "DownloadFiles"); // 提前创建目录 if (!folder.exists()) { folder.mkdirs(); } AndroidNetworking.download(url, folder.getAbsolutePath(), "video.mp4") .setTag("tag") .setPriority(Priority.MEDIUM) // 添加防盗链所需请求头 .addHeaders("Referer", "https://www.dailymotion.com/") .addHeaders("User-Agent", "Mozilla/5.0 (Linux; Android 13; SM-G998U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36") // 开启重定向跟随 .setFollowRedirects(true) .build() .setDownloadProgressListener((bytesDownloaded, totalBytes) -> Log.d("downloading", "downloaded:" + bytesDownloaded + " total:" + totalBytes) ).startDownload(new DownloadListener() { @Override public void onDownloadComplete() { Log.d("download", "下载完成"); } @Override public void onError(ANError anError) { // 打印详细错误信息方便排查 Log.d("error", "错误详情:" + anError.getErrorDetail() + ",响应码:" + anError.getErrorCode()); } }); }
内容的提问来源于stack exchange,提问作者Zahid Yameen
相关产品推荐
相关产品推荐

