在 Android 中,WebView 文件下载通常涉及到监听 WebView 的下载请求并使用系统下载管理器(DownloadManager)进行文件下载。以下是实现 WebView 文件下载的基本步骤:

1. 添加网络权限和文件下载权限:

在 AndroidManifest.xml 文件中添加网络权限和文件下载权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 设置 WebView 下载监听:

在 onCreate 方法中,为 WebView 设置下载监听:
WebView webView = findViewById(R.id.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.setTitle("File Download");
        request.setDescription("Downloading file...");

        // 设置文件保存路径
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "filename.ext");

        // 获取下载服务
        DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

        // 将下载请求添加到下载队列
        long downloadId = downloadManager.enqueue(request);
    }
});

// 加载网页
webView.loadUrl("https://www.example.com");

3. 添加广播接收器监听下载完成:

创建一个广播接收器用于监听下载完成事件:
public class DownloadCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取下载完成的文件ID
        long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

        if (downloadId != -1) {
            // 打开下载的文件
            openDownloadedFile(context, downloadId);
        }
    }

    private void openDownloadedFile(Context context, long downloadId) {
        DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

        // 查询下载任务的信息
        DownloadManager.Query query = new DownloadManager.Query();
        query.setFilterById(downloadId);
        Cursor cursor = downloadManager.query(query);

        if (cursor.moveToFirst()) {
            int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));

            // 检查下载状态
            if (status == DownloadManager.STATUS_SUCCESSFUL) {
                // 获取下载文件的本地URI
                String localUri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));

                // 使用 Intent 打开文件
                Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
                openFileIntent.setDataAndType(Uri.parse(localUri), "application/*");
                openFileIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

                try {
                    context.startActivity(openFileIntent);
                } catch (ActivityNotFoundException e) {
                    // 处理没有找到适合的应用程序来打开文件的情况
                    Toast.makeText(context, "No application found to open the file", Toast.LENGTH_SHORT).show();
                }
            }
        }

        cursor.close();
    }
}

4. 注册广播接收器:

在 onCreate 方法中注册广播接收器:
DownloadCompleteReceiver receiver = new DownloadCompleteReceiver();
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

注意事项:

  •  下载的文件路径需要合适地设置,确保有足够的权限。

  •  在真实的应用中,你可能需要更灵活地处理不同类型的文件和提供用户友好的交互。


上述代码提供了一个基本的文件下载示例。在实际应用中,你可能还需要添加一些错误处理和用户提示,以确保下载过程的顺利完成。


转载请注明出处:http://www.zyzy.cn/article/detail/15203/Android