2014-09-18 2 views
2

в моем приложении для Android. Я использую диспетчер загрузки системы для загрузки фотографии, после ее получения обрабатываю ее, а затем мне нужно переместить ее в другое место. если я просто скопирую его, он отлично работает, если я попытаюсь переместить его/удалить, я получаю исключение, о котором он не может быть перемещен.Невозможно переместить файл после того, как DownloadManager завершает загрузку

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()); 
    } 

ответ

4

я думаю, что вы не можете удалить кэш downloadmanager, я думаю, что она очищает себя автоматически после того, как вы удалили downloadid из своей базы данных, но если вы хотите, чтобы иметь контроль в файл вы можете установите целевую папку на ваше личное внешнее хранилище, а затем после завершения загрузки удалите ее.

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

и после того, как загрузка закончена, Вы можете удалить это нравится:

from.delete(); 

и док говорит:

общественных ИНТО удаление (длинная ... ида)

Отмените скачивание и удалите их с менеджером загрузки. Каждая загрузка будет остановлена, если она будет запущена, , и она больше не будет доступна через диспетчер загрузки. Если есть загруженный файл, частичный или полный, он удаляется.

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

+0

сообщение отредактировал видеть пожалуйста – mmlooloo

+0

спасибо @mmlooloo –