Skip to content

Bug: COLUMN_LOCAL_URI 为空时 recreate 方法抛出异常(NullPointerException) #39

Description

@VincentHQL

问题描述
在 Android 平台的 BackgroundDownload.java 文件中,BackgroundDownload.recreate() 方法会直接获取 DownloadManager 的 COLUMN_LOCAL_URI 字段(即 cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)) ),但是该字段只有在下载完成后才会有值。在下载进行中或失败时,该字段为 null,代码中直接 Uri.parse(null) 会导致 NullPointerException 或类似错误。

复现步骤

  1. 启动后台下载(未完成)
  2. 重新进入 app,或调用 recreate() 方法恢复下载状态
  3. 如果 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions