使用 donwloadManager 下载的文件消失

Files downloaded with donwloadManager disappears

我有一个应用程序可以从服务器下载大约 6000 张照片并将它们存储在我的应用程序设置配置的文件夹中,我使用 .nomedia 文件将文件隐藏在图库中,它们只在我的应用程序库中可见, 但是当我离开我的设备充电时,大约 5000 张照片消失了,文件夹中只剩下大约 920 张照片,我完全不知道为什么文件被删除了。

这是我的下载文件代码

    DownloadManager downloadManager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
    DownloadManager.Request request;
    fileURL = convertUri(fileURL);
    if (!URLUtil.isValidUrl(fileURL)) { return false; }
    Uri downloadUri = Uri.parse(fileURL);
    String fileName = URLUtil.guessFileName(fileURL, null, MimeTypeMap.getFileExtensionFromUrl(fileURL));
    deleteFileIfExists( new File( getAbsolutePath(path), fileName ));
    request = new DownloadManager.Request(downloadUri);
    request.setAllowedNetworkTypes( DownloadManager.Request.NETWORK_WIFI )
            .setTitle(fileName)
            .setAllowedOverRoaming(false)
            .setVisibleInDownloadsUi(false)
            .setDestinationInExternalPublicDir( getPath(path), fileName );
    downloadManager.enqueue(request);

将 System.currenttimeMillisecond() 添加到 fileUrl 以确保您的文件名不重复。

这个周末我用 3 种不同的设备和 2 种不同的下载方法进行了测试,在带有下载管理器的方法中,文件消失了,所以如果有人有同样的问题,我是这样下载文件的:

public static boolean downloadFile(Activity activity, String fileURL) {
    fileURL = convertUri(fileURL);
    if (!URLUtil.isValidUrl(fileURL)) { return false; }

    try {
        String fileName = URLUtil.guessFileName(fileURL, null, MimeTypeMap.getFileExtensionFromUrl(fileURL));
        deleteFileIfExists( new File( activity.getExternalFilesDir(""), fileName ));

        URL u = new URL(fileURL);
        URLConnection conn = u.openConnection();
        int contentLength = conn.getContentLength();

        DataInputStream stream = new DataInputStream(u.openStream());

        byte[] buffer = new byte[contentLength];
        stream.readFully(buffer);
        stream.close();

        File file = new File(activity.getExternalFilesDir(""), fileName);
        DataOutputStream fos = new DataOutputStream(new FileOutputStream(file));
        fos.write(buffer);
        fos.flush();
        fos.close();
    } catch(FileNotFoundException e) {
        return false; // swallow a 404
    } catch (IOException e) {
        return false; // swallow a 404
    }
    return true;
}