Я использую веб-просмотр в приложении для Android. Я пытаюсь загрузить файл .pdf, однако при переходе по ссылке через приложение имя файла .pdf изменяется на "1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf.pdf" и не сохраняется с исходным именем файла.
Как заставить веб-просмотр сохранить файл с оригинальным именем? На данный момент веб-просмотр сохраняет файл, используя идентификатор в качестве имени.
Используемая ссылка:https://drive.google.com/uc?export=download&id=1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf
Веб-просмотр:
webView.setDownloadListener(new DownloadListener()
{
@Override
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimeType,
long contentLength) {
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse(url));
request.setMimeType(mimeType);
String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie", cookies);
request.addRequestHeader("User-Agent", userAgent);
request.setDescription("Downloading File...");
request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(
url, contentDisposition, mimeType));
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
dm.enqueue(request);
Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
}});
Разрешения в манифесте:
<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name = "android.permission.INTERNET" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name = "android.permission.ACCESS_DOWNLOAD_MANAGER"/>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Возможность использования DownloadManager
Для этого вы должны добавить событие onNavigating в свой WebView. Если пользователь нацелен на файл PDF, вы можете остановить процесс загрузки с помощью: ags.Cancel = true И этот момент, когда вы можете передать URL-адрес DownloadManager, который загрузит ваш файл.
Я понимаю, но как я мог поместить это в код? Извините, если это кажется слишком очевидным, я новичок в студии Android.
Я написал новый ответ с образцом
Спасибо за помощь :D
Вот простой код
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
if (url.contains(".pdf")){
downloadFile(url)
}
return false
}
}
fun downloadFile(url: String) {
Log.d(TAG, "downloadFile: url = $url")
val manager = getSystemService(Activity.DOWNLOAD_SERVICE) as DownloadManager
val uri =
Uri.parse(url)
val request = DownloadManager.Request(uri)
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
val reference: Long = manager.enqueue(request)
}
Вот тест с вашей ссылкой (на Котлине). Если вам нужен пример Java, пожалуйста, дайте мне знать:
private fun test() {
webView = findViewById(R.id.webView)
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
Log.d(TAG, "shouldOverrideUrlLoading:url = ${url}")
if (url.contains("=download")){
Log.d(TAG, "shouldOverrideUrlLoading: ")
downloadFile(url)
webView.stopLoading()
}
return true
}
}
val url = "https://drive.google.com/uc?export=download&id=1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf"
webView.loadUrl(url)
}
fun downloadFile(url: String) {
Log.d(TAG, "downloadFile: url = $url")
val manager = getSystemService(Activity.DOWNLOAD_SERVICE) as DownloadManager
val uri =
Uri.parse(url)
val request = DownloadManager.Request(uri)
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
val reference: Long = manager.enqueue(request)
}
Java-код:
private void test() {
webView = findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains("=download")){
downloadFile(url);
}
return super.shouldOverrideUrlLoading(view, url);
}
});
String url = "https://drive.google.com/uc?export=download&id=1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf";
webView.loadUrl(url);
}
private void downloadFile(String url) {
DownloadManager manager = (DownloadManager) getSystemService(Activity.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
manager.enqueue(request);
}
Оооо волшебство! :D Я пытаюсь написать то же самое на Java, но пока не получается, не могли бы вы мне помочь?
Я пишу код Java. Что ты видишь? Ошибка или что-то другое?
Я сделал java-код. Я изменил свой ответ с ним
Появляется, не может разрешить символ забавы
Который из? В чем проблема?
Возможно, вам следует использовать функцию «Invalidate Caches» из меню «Файл» в Android Studio.
Ооо, это сработало как по волшебству. Большое спасибо за помощь и обучение. :D
добро пожаловать :)
URLUtil.guessFileName не запрашивает у документа имя файла, а пытается угадать имя файла только по URL-адресу. Если имя нужного файла отсутствует в URL-адресе, оно туда не попадет. Вам нужно будет указать имя файла из другого места.