I’m using webview in an Android application. I am trying to download a .pdf file, however when the link is clicked through the application the .pdf file name is changed to “1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf.pdf”, and is not saved with the original file name.
How to make webview save the file with the original name? At the moment the webview is saving the file using the ID as the name.
Used link: https://drive.google.com/uc?export=download&id=1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf
WebView:
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(); }});
Permissions in Manifest:
<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"/>
Advertisement
Answer
Here a test with your link (in Kotlin). If you need a Java example, please, let me know:
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 code:
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); }