7.5.4 WebView File Download
Category Android Basic Tutorial
Introduction
>
This section introduces the concept of file downloading in WebView. When using a regular browser like UC, clicking on a downloadable link initiates the download process. WebView, acting as a browser component, also supports file downloads. You can customize the download process, specify where and under what name the file should be saved, or use other built-in browsers like Chrome or UC for downloading. Below is a demonstration of its usage!
1. Using Other Browsers to Download Files:
>
This is straightforward. We just need to set a DownloadListener for the WebView and override the onDownloadStart method within DownloadListener. Then, create an Intent and start the corresponding Activity.
Key Code:
wView.setDownloadListener(new DownloadListener(){
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition,
String mimetype, long contentLength) {
Log.e("HEHE","Download started");
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}
});
If multiple browsers are installed on your phone, a dialog will appear allowing you to choose one for the download.
2. Writing a Thread to Download Files
>
If you prefer not to use the default path for downloaded files or want to customize the file name, you can write a thread to handle the download. Here's an example implementation:
Core Code:
We create a separate download thread class:
DownLoadThread.java
/**
* Created by Jay on 2015/9/14 0014.
*/
public class DownLoadThread implements Runnable {
private String dlUrl;
public DownLoadThread(String dlUrl) {
this.dlUrl = dlUrl;
}
@Override
public void run() {
Log.e("HEHE", "Download started~~~~~");
InputStream in = null;
FileOutputStream fout = null;
try {
URL httpUrl = new URL(dlUrl);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
in = conn.getInputStream();
File downloadFile, sdFile;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Log.e("HEHE","SD card writable");
downloadFile = Environment.getExternalStorageDirectory();
sdFile = new File(downloadFile, "csdn_client.apk");
fout = new FileOutputStream(sdFile);
}else{
Log.e("HEHE","SD card not present or not writable");
}
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
fout.write(buffer, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fout != null) {
try {
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Log.e("HEHE", "Download completed~~~~");
}
}
Then, in MainActivity.java, create and start the thread:
wView.setDownloadListener(new DownloadListener(){
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition,
String mimetype, long contentLength) {
Log.e("HEHE","onDownloadStart called: Download link: " + url);
new Thread(new DownLoadThread(url)).start();
}
});
Result:
Upon opening the SD card, you can see the downloaded file has been saved there:
Notes:
Remember to include permissions for SD card read/write and internet access:
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Permission to create and delete files on the SD card -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- Permission to write to the SD card -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Also, ensure in = conn.getInputStream() is placed after all connection settings are configured; otherwise, it may not read anything!
Summary:
>
This section is quite simple; the key is using setDownloadListener and overriding the onDownloadStart method to handle the download process. That's all for this section, thank you!
-1.0.1 2015 Latest Android Basic Tutorial Contents
-1.1 Background and System Architecture Analysis
-1.2 Development Environment Setup
-1.2.1 Developing Android Apps with Eclipse + ADT + SDK
-1.2.2 Developing Android Apps with Android Studio
-1.3 Solving SDK Update Issues
-1.4 Genymotion Emulator Installation
-1.5.1 Git Tutorial: Basic Operations on Local Repositories
-1.5.2 Git: Setting Up a Remote Repository on GitHub
-1.6 How to Use 9-Patch Images
-1.7 Interface Prototype Design
-1.8 Project Source Analysis (Various Files, Resource Access)
-1.9 Signing and Packaging Android Applications
-1.11 Decompiling APK to Retrieve Code & Resources
-2.1 Concepts of View and ViewGroup
-2.2.1 LinearLayout (Linear Layout)
-2.2.2 RelativeLayout (Relative Layout)
-2.2.3 TableLayout (Table Layout)
-2.2.4 FrameLayout (Frame Layout)
-2.2.5 GridLayout (Grid Layout)
-2.2.6 AbsoluteLayout (Absolute Layout)
-2.3.1 Detailed Explanation of TextView (Text Box)
- 2.3.2 EditText (Input Box) Detailed Explanation
- 2.3.3 Button and ImageButton
- 2.3.4 ImageView (Image View)
- 2.3.5 RadioButton (Single-choice Button) & Checkbox (Multiple-choice Box)
- 2.3.6 ToggleButton and Switch
- 2.3.7 ProgressBar (Progress Bar)
- 2.3.8 SeekBar (Drag Bar)
- 2.3.9 RatingBar (Star Rating Bar)
- 2.4.1 ScrollView (Scroll Bar)
- 2.4.2 Date & Time Components (Part 1)
- 2.4.3 Date & Time Components (Part 2)
- 2.4.4 Adapter Basics
- 2.4.5 Simple Usage of ListView
- 2.4.6 Optimization of BaseAdapter
- 2.4.7 Focus Issues with ListView
- 2.4.8 Solving Checkbox Misalignment in ListView
- 2.4.9 Data Update Issues in ListView
- 2.5.0 Building a Reusable Custom BaseAdapter
- 2.5.1 Implementation of Multi-layout ListView Items
- 2.5.2 Basic Usage of GridView (Grid View)
- 2.5.3 Basic Usage of Spinner (List Option Box)
- 2.5.4 Basic Usage of AutoCompleteTextView (Auto-complete Text Box)
- 2.5.5 Basic Usage of ExpandableListView (Collapsible List)
- 2.5.6 Basic Usage of ViewFlipper (Flip View)
- 2.5.7 Basic Usage of Toast
- 2.5.8 Detailed Explanation of Notification (Status Bar Notification)
- 2.5.9 Detailed Explanation of AlertDialog (Dialog Box)
- 2.6.0 Basic Usage of Several Common Dialogs
- 2.6.1 Basic Usage of PopupWindow (Floating Box)
- 2.6.2 Menu (Menu)
- 2.6.3 Simple Usage of ViewPager
- 2.6.4 Simple Usage of DrawerLayout (Official Side Sliding Menu)
- 3.1.1 Event Handling Mechanism Based on Listeners
- 3.2 Event Handling Mechanism Based on Callbacks
- 3.3 Analysis of Handler Message Passing Mechanism
- 3.4 TouchListener vs OnTouchEvent + Multi-touch
- 3.5 Listening to Content Changes in EditText
- 3.6 Responding to System Setting Events (Configuration Class)
- 3.7 AsyncTask Asynchronous Task
- 3.8 Gestures (Gestures)
- 4.1.1 Activity Beginner
- 4.1.2 Activity Intermediate
- 4.1.3 Activity Advanced
- 4.2.1 Service Introduction
- 4.2.2 Service Advanced
- 4.2.3 Service Expert
- 4.3.1 BroadcastReceiver Beginner
- 4.3.2 BroadcastReceiver Advanced
- 4.4.1 ContentProvider Introduction
- 4.4.2 ContentProvider Deep Dive – Document Provider
- 4.5.1 Basic Usage of Intent
- 4.5.2 Passing Complex Data with Intent
- 5.1 Fragment Basic Overview
- 5.2.1 Fragment Example – Bottom Navigation Bar Implementation (Method 1)
- 5.2.2 Fragment Example – Bottom Navigation Bar Implementation (Method 2)
- 5.2.3 Fragment Example – Bottom Navigation Bar Implementation (Method 3)
- 5.2.4 Fragment Example – Bottom Navigation Bar + ViewPager Page Swiping
- 5.2.5 Fragment Example – Simple Implementation of News (Shopping) App List Fragment
- 6.1 Data Storage and Access – File Storage and Reading
- 6.2 Data Storage and Access – SharedPreferences for Saving User Preferences
- 6.3.1 Data Storage and Access – Introduction to SQLite Database
- 6.3.2 Data Storage and Access – Further Exploration of SQLite Database
- 7.1.1 Android Network Programming and Learning HTTP Protocol
- 7.1.2 Learning HTTP Request and Response Headers in Android
- 7.1.3 Android HTTP Request Method: HttpURLConnection
- 7.1.4 Android HTTP Request Method: HttpClient
- 7.2.1 Android XML Data Parsing
- 7.2.2 Android JSON Data Parsing
- 7.3.1 Android File Upload
- 7.3.2 Android File Download (1)
- 7.3.3 Android File Download (2)
- 7.4 Android Calling WebService
- 7.5.1 Basic Usage of WebView (Web View)
- 7.5.2 Basic Interaction Between WebView and JavaScript
- 7.5.3 Considerations for WebView in Android 4.4 and Later
- 7.5.4 WebView File Download
- 7.5.5 WebView Cache Issues
- 7.5.6 WebView Handling Error Code Information from Web Pages
- 7.6.1 Socket Learning Network Basics Preparation
- 7.6.2 Socket Communication Based on TCP Protocol (1)
- 7.6.3 Socket Communication Based on TCP Protocol (2)
- 7.6.4 Socket Communication Based on UDP Protocol
- 8.1.1 Summary of 13 Drawable Types in Android Part 1
- 8.1.2 Summary of 13 Drawable Types in Android Part 2
- 8.1.3 Summary of 13 Drawable Types in Android Part 3
- 8.2.1 Comprehensive Analysis of Bitmap (Bitmap) Part 1
- 8.2.2 OOM Issues Caused by Bitmap
- 8.3.1 Detailed Explanation of Three Drawing Tool Classes
- 8.3.2 Practical Examples of Drawing Classes
- 8.3.3 Paint API —— MaskFilter (Mask)
- 8.3.4 Paint API —— Xfermode and PorterDuff Detailed Explanation (Part 1)
- 8.3.5 Paint API —— Xfermode and PorterDuff Detailed Explanation (Part 2)
- 8.3.6 Paint API —— Xfermode and PorterDuff Detailed Explanation (Part 3)
- 8.3.7 Paint API —— Xfermode and PorterDuff Detailed Explanation (Part 4)
- 8.3.8 Paint API —— Xfermode and PorterDuff Detailed Explanation (Part 5)
- 8.3.9 Paint API —— ColorFilter (Color Filter) (1/3)
- 8.3.10 Paint API —— ColorFilter (Color Filter) (2/3)
- 8.3.11 Paint API —— ColorFilter (Color Filter) (3/3)
- 8.3.12 Paint API —— PathEffect (Path Effect)
- 8.3.13 Paint API —— Shader (Image Rendering)
- 8.3.14 Paint Enumerations/Constants and ShadowLayer Shadow Effect
- 8.3.15 Paint API —— Typeface (Font Style)
- 8.3.16 Canvas API Detailed Explanation (Part 1)
- 8.3.17 Canvas API Detailed Explanation (Part 2) Clipping Methods Collection
- 8.3.18 Canvas API Detailed Explanation (Part 3) Matrix and drawBitmapMesh
- 8.4.1 Frame Animation in Android Animation Collection
- 8.4.2 Tween Animation in Android Animation Collection
- 8.4.3 Property Animation in Android Animation Collection - First Encounter
- 8.4.4 Property Animation in Android Animation Collection - Another Encounter
- 9.1 Playing Sound Effects with SoundPool (Duang~)
- 9.2 MediaPlayer for Audio and Video Playback
- 9.3 Using Camera to Take Photos
- 9.4 Using MediaRecord for Recording
- 10.1 TelephonyManager (Telephony Manager)
- 10.2 SmsManager (SMS Manager)
- 10.3 AudioManager (Audio Manager)
- 10.4 Vibrator (Vibrator)
- 10.5 AlarmManager (Alarm Service)
- 10.6 PowerManager (Power Service)
- 10.7 WindowManager (Window Management Service)
- 10.8 LayoutInflater (Layout Service)
- 10.9 WallpaperManager (Wallpaper Manager)
- 10.10 Sensor Topic (1) —— Introduction
- 10.11 Sensor Topic (2) —— Orientation Sensor
- 10.12 Sensor Topic (3) —— Accelerometer/Gyroscope Sensor
- 10.12 Sensor Topic (4) —— Understanding Other Sensors
- 10.14 Android GPS Introduction
- 11.0《2015 Latest Android Basic Beginner's Tutorial》Completion Celebration~
- 12.1 Android Practice: DrySister Viewing Girls App (First Edition) -- Project Setup and Simple Implementation
- 12.2 DrySister Viewing Girls App (First Edition) —— 2. Parsing Backend Data
- 12.3 DrySister Viewing Girls App (First Edition) —— 3. Image Loading Optimization (Writing a Small Image Cache Framework)
- 12.4 DrySister Viewing Girls App (First Edition) —— 4. Adding Data Caching (Introducing SQLite)
- 12.5 DrySister Viewing Girls App (First Edition) —— 5. Code Review, Adjustment, and Logging Class Writing
- 12.6 DrySister Viewing Girls App (First Edition) —— 6. Icon Creation, Obfuscation, Signing, Packaging, APK Slimming, App Release