DownloadManager: Свежезагруженный файл исчезает сам по себе

У меня очень странная проблема с использованием DownloadManager.

Я загружаю несколько файлов .zip в /mnt/sdcard/Download.

Вызывается BroadcastReceiver.onReceive(), и проверка существования загруженного файла возвращает значение true.

Однако через несколько мгновений файл исчез.

Хотя я его не удаляю. Разрешение WRITE_EXTERNAL_STORAGE установлено.

Любые идеи, что может вызвать эту проблему или как ее исправить ...?

Изменить: вот код:

public class DownloadUtil {
private DownloadTask task = null;
private long downloadQueueId;
private DownloadManager downloadManager;
private DownloadCallback callback = null;


public DownloadUtil(DownloadCallback callback) {
    this.callback = callback;
}

public interface DownloadCallback {
    public void onDownloadComplete(String filename);
}

/** 
 * Call this to download a file.
 */
public void downloadFile(String address, String destName) {
    if (task != null) {
        return;
    }

    task = new DownloadTask(address, destName);
    task.execute((Void) null);
}

/**
 * Represents an asynchronous login/registration task used to download.
 */
public class DownloadTask extends AsyncTask<Void, Void, Boolean> {
    String address;
    String destName;

    public DownloadTask(String address, String destName) {
        this.address = address;
        this.destName = destName;
    }
    @Override
    protected Boolean doInBackground(Void... params) {
        boolean retVal = true;

        try {
            download(address, destName);
        } catch (Exception e1) {
            retVal = false;
            e1.printStackTrace();
            Log.e("DownloadUtil.java", "Exception downloading: ", e1);
        } 

        return retVal;
    }

    @Override
    protected void onPostExecute(final Boolean success) {
        task = null;

        if (success) {
            // finish();
        } else {

        }
    }

    @Override
    protected void onCancelled() {
        task = null;
    }
}


/**
 * Performs the actual download.
 */
private boolean download(String address, String destName) throws ClientProtocolException, IOException {
    boolean retVal = false;

    BroadcastReceiver onDownloadComplete = new BroadcastReceiver() {
        public void onReceive(Context ctxt, Intent intent) {
            String action = intent.getAction();
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                Query query = new Query();
                query.setFilterById(downloadQueueId);
                Cursor c = downloadManager.query(query);
                if (c.moveToFirst()) {
                    int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                    if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                        String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                        Log.i("DownloadUtil.java", "File downloaded to: "+uriString);

                        uriString = uriString.substring(7);
                        File f = new File(uriString);
                        Log.i("DownloadUtil.java", "File: "+uriString+" exits: "+f.exists());
                        callback.onDownloadComplete(uriString);
                    }
                }
                TabLayoutActivity.context.unregisterReceiver(this);
            }
        }
    };

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(address));
    request.setDescription("Download Request");
    request.setTitle("Download");
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, destName);

    downloadManager = (DownloadManager) TabLayoutActivity.context.getSystemService(Context.DOWNLOAD_SERVICE);
    TabLayoutActivity.context.registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    downloadQueueId = downloadManager.enqueue(request);

    return retVal;
}

}

Редактировать 2: Может ли такое поведение быть вызвано удаленным сервером? Я только что заметил, что код работает хорошо, если я загружаю точно такой же файл с одного из своих серверов. Кажется, это вызывает проблемы только в том случае, если файл загружается с сервера клиентов.


person user2779473    schedule 14.09.2013    source источник
comment
он не отображается в вашем приложении или в /mnt/sdcard/Download.?   -  person Metalhead1247    schedule 14.09.2013
comment
Файл отображается в приложении. Вызов file.exists() возвращает true, если вызывается в BroadcastReceiver.onReceive(). Я даже не могу открыть и прочитать его содержимое. Однако через несколько секунд file.exists() вернет false(), и файл исчезнет из /mnt/sdcard/Download. Бывает на эмуляторе кстати.   -  person user2779473    schedule 14.09.2013
comment
Затем вам нужно вставить свой код, чтобы мы могли видеть, что происходит   -  person Metalhead1247    schedule 14.09.2013


Ответы (2)


Проверьте эту проблему:

Проблема 18462: Android DownloadManager загружает один и тот же файл дважды, на других не удается (ошибка 1008). , ERROR_CANNOT_RESUME)

person artkoenig    schedule 18.11.2013

Да, это связано с проблемами, перечисленными @Artjom. В DownloadManager есть ошибка, из-за которой он иногда (часто?) запускает другой запрос на загрузку для уже завершенной загрузки. ACTION_DOWNLOAD_COMPLETE также передается в широковещательном режиме, но поскольку последующая загрузка не удалась, она удаляет запись о загрузке и дополнительно удаляет локальный файл.

Я обошел эту проблему, проверив существование (+ размер) и переместив файл в другое место.

person plin    schedule 20.11.2013