Download file inside WebView from android 13 – Android

by
Ali Hasan
android android-external-storage download

Quick Fix: Set a download listener on the WebView and use the DownloadManager to download the file to the external Downloads directory. Handle permission handling and add code to include cookies if the file requires authentication.

The Problem:

In my Android (13) application, I have a WebView that allows users to browse the internet. When users click on a link to download a file, the download does not start. I have already implemented the necessary permissions, including WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO, READ_MEDIA_IMAGES, ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE, WRITE_EXTERNAL_STORAGE, DOWNLOAD_WITHOUT_NOTIFICATION, and ACCESS_DOWNLOAD_MANAGER. Strangely, if I switch to the default Android browser, the downloads work as expected. How can I enable file downloads within my WebView in Android 13?

The Solutions:

Solution 1: Permission handling and cookies consideration

1. Permission Handling:

  • For Android devices running API level 29 and above, you don’t need to request the WRITE_EXTERNAL_STORAGE permission to download files to the shared Downloads directory.
  • For devices running API level 28 and below, you need to declare the WRITE_EXTERNAL_STORAGE permission in your manifest and handle the permission request result.

2. Download Logic:

  • Use the setDownloadListener on the WebView to listen for download requests.
  • Parse the URL string to a Uri object.
  • Extract the file name and extension from the URL.
  • Construct a DownloadManager.Request object and set appropriate parameters like destination directory, notification visibility, and user-agent.
  • Add cookies to the request header if necessary.
  • Start the download using the DownloadManager.

3. Cookies Handling:

  • Use the CookieManager to get cookies from the WebView.
  • If cookies are available, add them to the DownloadManager.Request header.

4. Handling API Level Differences:

  • To support API level 28 and below, handle the permission request result and display an appropriate dialog if the permission is denied.
  • Check for cookies and display an error dialog if they are not available in certain WebView versions.

5. Implementation:

  • The provided Git repository offers a complete working example.

Key Points:

  • Permission handling is crucial for devices running API level 28 and below.
  • Use the CookieManager to handle cookies when downloading files requiring authentication.
  • The implementation provided in the Git repository provides a comprehensive solution.

Solution 2: Utilize WebView’s Download Listener

Android 13 introduced a new download listener for web views, allowing for seamless file downloads from within the WebView itself. Here’s how you can implement it:

  1. Implement the DownloadListener:
    Add the following code to your Activity or Fragment that contains the WebView:
binding.webView.setDownloadListener { url, _, _, _, _ ->
    // Trigger the download of the file
    binding.webView.loadUrl(url)
}
  • The setDownloadListener method accepts a DownloadListener interface as an argument.
  • Inside the onDownloadStart method, the url parameter represents the URL of the file to be downloaded.
  • loadUrl(url) method initiates the download process by loading the file’s URL in the WebView.
  1. Request Necessary Permissions:
    Ensure that you have declared the necessary permissions in your app’s manifest file:
  • WRITE_EXTERNAL_STORAGE: To save the downloaded file to the device’s storage.
  • READ_EXTERNAL_STORAGE: To access the device’s storage for saving the file.
  1. Handle Downloaded Files:
    Once the file is downloaded, you can handle it further, such as displaying a notification or opening it in an appropriate application. You can do this by overriding the onReceive method in a BroadcastReceiver and listening for the ACTION_DOWNLOAD_COMPLETE intent.

  2. Additional Tips:

  • You can customize the location where the file is saved by creating a DownloadManager object and setting the destination directory.
  • For larger downloads, you may want to display a progress bar or provide feedback to the user.
  • You can also use third-party libraries that provide additional features and customization options for file downloads in WebView.

This approach allows for a seamless file download experience within the WebView, without requiring the user to leave the app or switch to another browser.

Q&A

How to download files from webview in android 13?

Add permission & set download listener on webview.

What is the use of DownloadManager?

It is used to download the file to the external Downloads directory.

Video Explanation:

The following video, titled "Download file inside WebView from android 13 | Android Studio ...", provides additional insights and in-depth exploration related to the topics discussed in this post.

Play video

java Android 13 WebView download not working ,, how to fix Android 13 WebView download not working 2023 , Android 13 WebView download not ...