📜  在 android 中处理 webview 下载链接 (1)

📅  最后修改于: 2023-12-03 15:23:06.432000             🧑  作者: Mango

在 Android 中处理 WebView 下载链接

当我们在 Android 应用中使用 WebView 显示网页时,可能会遇到需要下载文件的情况。如果希望用户能够在应用内完成下载而不是跳转到系统自带的下载管理器,我们就需要在代码中进行相应的设置。

设置 WebView 下载监听器

要实现在应用内下载文件,需要添加一个 WebView 下载监听器,代码如下:

webView.setDownloadListener(new DownloadListener() {
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
        //在此处处理下载链接
    }
});

其中,url 就是要下载的链接,而其余参数则可能会用到(例如获取文件名、文件类型等)。

处理下载链接

要让 WebView 在应用内完成下载,可以使用 Android 自带的下载管理器或第三方下载库。此处以 Android 自带的下载管理器为例。

创建下载请求

我们需要创建一个下载请求,其中需要指定下载链接、文件名、文件类型等信息。代码如下:

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(title);
request.setDescription(description);
request.setMimeType(mimeType);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);

其中,uri.parse() 方法将下载链接转换成 Uri 对象,setTitle()setDescription() 分别用于设置下载通知栏中的标题和描述,setMimeType() 可以设置文件的 MIME 类型,setDestinationInExternalPublicDir() 则用于设置存储文件的路径和文件名。

发起下载请求

请求创建后,就可以通过系统自带的下载管理器启动下载任务,并返回下载任务的 ID。代码如下:

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long downloadId = downloadManager.enqueue(request);
监听下载完成状态

下载任务启动后,我们还需要监听下载完成状态,以便在下载完成后做一些清理工作或者提示用户下载已完成。代码如下:

BroadcastReceiver onComplete = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
        if (id == downloadId) {
            //下载完成后的处理工作
        }
    }
};
registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

在这里,我们创建了一个 BroadcastReceiver 对象,用于接收下载完成的广播。在广播接收器中,我们获取下载任务 ID,如果该 ID 与我们发起下载请求时得到的 ID 相同,就说明下载完成了。

总结

通过以上的步骤,我们已经实现了在 Android 应用中下载 WebView 中的链接文件的功能。当用户点击下载链接时,应用内将会启动下载任务,并在下载完成后提示用户。

注意,如果想要使用 Android 自带的下载管理器,需要在 AndroidManifest.xml 文件中添加相应权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />