Downloading a file from Webview does not work in android, I try,

Below is my code for implementing web browsing, which opens a link that has tabular information on choosing a date and having three buttons at the bottom for downloading PDF files, xls and doc download works well in a browser, but it doesn’t download in a web review!

public class Reports_Visit_Statastics extends AppCompatActivity { WebView wb; String ReportsURL, title; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.visit_statastics_reports); wb = (WebView) findViewById(webView); wb.getSettings().setLoadsImagesAutomatically(true); wb.getSettings().setJavaScriptEnabled(true); wb.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); Bundle b = getIntent().getExtras(); ReportsURL = b.getString("URL"); title = b.getString("title"); initToolbar(); wb.setWebViewClient(new MyWebViewClient()); wb.loadUrl(ReportsURL); } private class MyWebViewClient extends WebViewClient { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.d("WEB_VIEW_TEST", "error code:" + errorCode + " - " + description); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // handle different requests for different type of files // this example handles downloads requests for .apk and .mp3 files // everything else the webview can handle normally if (url.endsWith(".pdf")) { Uri source = Uri.parse(url); // Make a new request pointing to the .apk url DownloadManager.Request request = new DownloadManager.Request(source); // appears the same in Notification bar while downloading request.setDescription("Description for the DownloadManager Bar"); request.setTitle("Document"); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // save the file in the "Downloads" folder of SDCARD request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Document.doc"); // get download service and enqueue file DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request); } else if (url.endsWith(".doc")) { Uri source = Uri.parse(url); // Make a new request pointing to the .apk url DownloadManager.Request request = new DownloadManager.Request(source); // appears the same in Notification bar while downloading request.setDescription("Description for the DownloadManager Bar"); request.setTitle("Document"); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // save the file in the "Downloads" folder of SDCARD request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Document.doc"); // get download service and enqueue file DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request); } else if (url.endsWith(".xls")) { Uri source = Uri.parse(url); // Make a new request pointing to the .apk url DownloadManager.Request request = new DownloadManager.Request(source); // appears the same in Notification bar while downloading request.setDescription("Description for the DownloadManager Bar"); request.setTitle("Document"); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // save the file in the "Downloads" folder of SDCARD request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Document.doc"); // get download service and enqueue file DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request); } // if there is a link to anything else than .apk or .mp3 load the URL in the webview else view.loadUrl(url); return true; } } private void initToolbar() { final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); final ActionBar actionBar = getSupportActionBar(); try { if (actionBar != null) { actionBar.setTitle(title); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); } } catch (Exception e) { Log.d("Doctor_master", e.toString()); } } @Override public void onBackPressed() { super.onBackPressed(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { onBackPressed(); return true; } return super.onOptionsItemSelected(item); } } 
+1
android webview android-download-manager
source share
1 answer

Based on comments and chat discussions.

I noticed that shouldOverrideUrlLoading not being called. Like the android documentation shouldOverrideUrlLoading

Give the host app the ability to take control when the new url is loaded into the current WebView

But in your case, since the URL does not change in the WebView address bar when you click any of the three links. It just calls the javascript javascript code javascript:__doPostBack('lnkPDF','') , which calls the post method to generate the file. If you want to use DownloadManager to download a file when a notification is displayed in the notification area, you need to create a dynamic static url for files such as http: // or https: //. For example. http: //www.somedomain/may_be_session_id/some_random_file_number_valid_for_some_time_only/file_name.pdf .

In addition to the above, let the web page change or redirect to a new url, only then you can capture URLs in shouldOverrideUrlLoading .

Try changing the return implementation in shouldOverrideUrlLoading to True if the host application wants to leave the current WebView and process the URL itself, otherwise return false.

+2
source share

All Articles