Android DownloadManager получить имя файла
В моем приложении вы можете скачать некоторые файлы. Я использовал Android DownloadManager
класс для скачивания. После завершения загрузки, он должен показать мне сообщение, что файл был загружен. Проблема в том, что одновременно может быть 2,3 или 4 загрузки. Мой BroadcastReceiver
код выглядит так:
receiver_complete = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE) ){
Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.download_finished, "Here should be the name", Toast.LENGTH_SHORT).show();
}
}
};
как я могу получить текущее имя готового скачать?
спасибо.
4 ответов
Я думаю, что вы хотите положить что-то подобное в свой if
блок. Заменить YOUR_DM
С вашим экземпляром DownloadManager.
Bundle extras = intent.getExtras();
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
Cursor c = YOUR_DM.query(q);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
if (status == DownloadManager.STATUS_SUCCESSFUL) {
// process download
title = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE));
// get other required data by changing the constant passed to getColumnIndex
}
}
Ян Шеннон был совершенно прав в своем ответе, но я чувствую некоторое улучшение:
не забудьте закрыть
Cursor
после его использования, избегая "утечки Курсора". ЭтоCursor
потребляет много ресурсов и должен быть освобожден как можно скорее.-
если вы поместите какой-то заголовок для загрузки, например:
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setTitle("Some title");
значение, заданное
DownloadManager.COLUMN_TITLE
будет"Some title"
вместо имени файла. Поэтому я бы рекомендовал это вместо этого:String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
на
COLUMN_LOCAL_FILENAME
возвращает полный путь (/storage/sdcard0/Android/data/.../filename.ext
), но с этим кодом мы получим только имя файла.
код:
Bundle extras = intent.getExtras();
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
Cursor c = YOUR_DM.query(q);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
if (status == DownloadManager.STATUS_SUCCESSFUL) {
String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
filename = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
}
}
c.close();
Edit: замените YOUR_DM на экземпляр DownloadManager.
Я думаю, что то, что вы ищете, это DownloadManager.COLUMN_TITLE
вот ссылка на документы Android: http://developer.android.com/reference/android/app/DownloadManager.html#COLUMN_TITLE
и вот учебник, который объяснит больше, чем просто получение названия. Он предназначен для загрузки изображения с URL-адреса, а затем отображения его в приложении. В целом, я думаю, это очень полезно. разговор.
рекомендую попробовать этот код, чтобы получить имя файла
DownloadManager.COLUMN_LOCAL_FILENAME
Я не уверен в этом