Skip to content

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

@VincentHQL

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions