Android DownloadManager: getUriForDownloadedFile возвращает неверный путь

90
10

Я загружаю файл.apk с помощью библиотеки DownloadManager, и у меня есть служба BroadcastReceiver для загрузки. вот мой код в onRecieve():

  long id = intent.getExtras().getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
DownloadManager dm = (DownloadManager)context.getSystemService(context.DOWNLOAD_SERVICE);

intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(dm.getUriForDownloadedFile(id), "application/vnd.android.package-archive");
context.startActivity(intent);

проблема здесь, когда я вызываю UriForDownloadedFile (id) somtimes возвращают файл:///storage/emulated/0/Download/example.apk и на другое устройство возвращают содержимое://downloads/all_downloads/183

и я не могу установить apk с (content://downloads/all_downloads/183) path

спросил(а) 2017-04-10T16:23:00+03:00 3 года, 5 месяцев назад
1
Решение
58

Вы знаете, где DownloadManager загрузил файл, так как вы тот, кто сказал, где его скачать. Итак, избавитесь от getUriForDownloadedFile(id) на Android 6.0 и более старых устройствах и используйте Uri.fromFile() для File который вы сказали DownloadManager чтобы загрузить файл.

Обратите внимание, что на Android 7. 0+ вы должны использовать для этого content Uri, как только ваша targetSdkVersion достигает 24 или выше. К счастью, установщик знает, как обрабатывать схемы content на Android 7.0 и выше.

ответил(а) 2017-04-10T16:59:00+03:00 3 года, 5 месяцев назад
70

registerReceiver(
new BroadcastReceiver() {
@Override public void onReceive(Context context, Intent intent) {
final long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
if (downloadId == 0) return;

final Cursor cursor = downloadManager.query(
new DownloadManager.Query().setFilterById(downloadId));

if (cursor.moveToFirst()) {
final String downloadedTo = cursor.getString(
cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
Log.d(TAG, "The file has been downloaded to: " + downloadedTo);

context.startActivity(new Intent(Intent.ACTION_VIEW)
.setDataAndType(Uri.parse(downloadedTo),
"application/pdf"));
}
}
},
new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}

ответил(а) 2017-11-14T18:36:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема