DownloadManager完成下载后无法移动文件

时间:2014-09-18 08:54:36

标签: java android apache-commons android-download-manager

在我的Android应用程序中我使用系统下载管理器下载照片,一旦收到我处理它然后我需要将它移动到另一个位置。如果我只是复制它它工作正常,如果我尝试移动/删除它我得到一个例外,它不能被移动。

Failed to delete original file '/data/user/0/com.android.providers.downloads/cache/a3133p2930-9.jpg' after copy to '/data/data/com.XXXXX.testharness/app_appdata/images/one/two/three/6/a3133p2930.jpg'

也尝试过:

1)在尝试移动它之前将其从下载管理器中删除 2)将目标直接设置为目标目录,但出现错误我只能使用公共外部文件夹。 3)尝试使用JAVA renameTo和Apache commons moveFile

这是一段代码片段,展示了我正在做的事情的相关部分。

任何想法?

理解

@Override
public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();
    if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {


    String uriString = c.getString(
                        c.getColumnIndex(
                                DownloadManager.COLUMN_LOCAL_URI));


    String uri2String = c.getString(
                            c.getColumnIndex(
                                    DownloadManager.COLUMN_URI));

    String localFileString = c.getString(
                                c.getColumnIndex(
                                        DownloadManager.COLUMN_LOCAL_FILENAME));

    File from = new File(localFileString);
    File to = new File(appDataDir, localString);
    File to2 = new File (appDataDir, localString + "/" + getFileNameFromUrl(uri2String));


    if (!to.exists()) {
        if (to.mkdirs()) {
            Log.d(LCAT, "Directory  Created");
            }
        }
    dm.remove(downloadId);

    //boolean a = from.renameTo(to2);

    try { 
        FileUtils.copyFile(from, to2);
    } catch (Exception e) {
        Log.d(LCAT, "rename success? " + e.getMessage());
    }

1 个答案:

答案 0 :(得分:4)

我认为您无法删除downloadmanager的缓存,我认为它从您的数据库中删除了downloadid后会自动清除,但是如果您希望对文件进行控制,则可以将目标文件夹设置为私有外部存储然后在下载完成后删除它。

File rootDirectory = new File(getActivity().getExternalFilesDir(null).getAbsoluteFile().toString());
if(!rootDirectory.exists()){
   rootDirectory.mkdirs();
}  
req.setDestinationInExternalFilesDir(getActivity(),null ,"/" + fileName);

在下载完成后,您可以删除它:

 from.delete();

并且文档说:

  

public int remove(long ... ids)

     

取消下载并将其删除   下载管理器。如果它正在运行,每个下载都将停止,   并且将无法再通过下载管理器访问它。如果   有一个下载的文件,部分或完整,它被删除。

http://developer.android.com/reference/android/app/DownloadManager.html#remove%28long...%29