问题描述
在 Android 平台的 BackgroundDownload.java 文件中,BackgroundDownload.recreate() 方法会直接获取 DownloadManager 的 COLUMN_LOCAL_URI 字段(即 cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)) ),但是该字段只有在下载完成后才会有值。在下载进行中或失败时,该字段为 null,代码中直接 Uri.parse(null) 会导致 NullPointerException 或类似错误。
复现步骤
- 启动后台下载(未完成)
- 重新进入 app,或调用
recreate() 方法恢复下载状态
- 如果 Download 还没完成,
COLUMN_LOCAL_URI 为空,导致异常
建议修复
- 在解析 COLUMN_LOCAL_URI 之前判空,
- 推荐在 localUri==null 时,先用 DownloadManager#getUriForDownloadedFile(id) 获取已完成文件,否则安全 fallback(如空字符串或原始目标路径)
- 这样可以让 recreate() 方法对所有状态的下载恢复更加健壮,避免崩溃。
源码相关位置
https://github.com/Unity-Technologies/BackgroundDownload/blob/master/Runtime/Plugins/Android/backgrounddownload.androidlib/src/main/java/com/unity3d/backgrounddownload/BackgroundDownload.java#L15
public static BackgroundDownload recreate(Context context, long id) {
DownloadManager manager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(id);
Cursor cursor = manager.query(query);
if (cursor.getCount() == 0)
return null;
cursor.moveToFirst();
Uri url = Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)));
Uri dest = Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))); // 此处潜在空指针
cursor.close();
return new BackgroundDownload(manager, id, url, dest);
}
环境信息:
- 平台:Android(DownloadManager)
- 出错文件:BackgroundDownload.java
- 影响范围:后台下载未完成时调用恢复接口会崩溃
优先级建议: 中等-高
标签建议: bug, android, null pointer
问题描述
在 Android 平台的
BackgroundDownload.java文件中,BackgroundDownload.recreate()方法会直接获取 DownloadManager 的 COLUMN_LOCAL_URI 字段(即cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))),但是该字段只有在下载完成后才会有值。在下载进行中或失败时,该字段为 null,代码中直接 Uri.parse(null) 会导致 NullPointerException 或类似错误。复现步骤
recreate()方法恢复下载状态COLUMN_LOCAL_URI为空,导致异常建议修复
源码相关位置
https://github.com/Unity-Technologies/BackgroundDownload/blob/master/Runtime/Plugins/Android/backgrounddownload.androidlib/src/main/java/com/unity3d/backgrounddownload/BackgroundDownload.java#L15
环境信息:
优先级建议: 中等-高
标签建议: bug, android, null pointer