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