这更多的是出于好奇而不是需要解决的真正问题。我制作了一个包含WebView的Android应用程序。我使用了should override URL方法,以便在WebView中打开任何单击的链接。
后来我决定将文件从服务器下载到用户设备。不幸的是我以前没见过setDownloadListener方法。当用户现在单击链接时,不会启动下载。
据我所知,我需要使用适当的代码更新应用程序,即下载监听器或HttpClient,这没关系。
(冒着听起来像白痴的风险)我想知道,有没有办法通过服务器的动作我可以让WebView下载文件而不需要更改代码?
我猜这个功能不在WebView中,这可能是WebView打开浏览器下载文件的原因。只是想想也许我错过了一些让它成功的东西。我对此很新。
答案 0 :(得分:3)
您应该可以通过webview JavascripInterface在android中使用DownloadManager发布下载。到目前为止,我自己都在尝试这个并没有成功。我可能在webview和DownloadManager正在运行的上下文中遇到问题。如果能够工作,我会带回一些代码:)
更新:
以下代码对我来说效果很好。您可以使用以下内容:(只是要知道您只能使用Android 2.3中的DownloadManager)
myWebView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Log.d("WEB_VIEW_TEST", "error code:" + errorCode + " - " + description);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// handle different requests for different type of files
// this example handles downloads requests for .apk and .mp3 files
// everything else the webview can handle normally
if (url.endsWith(".apk")) {
Uri source = Uri.parse(url);
// Make a new request pointing to the .apk url
DownloadManager.Request request = new DownloadManager.Request(source);
// appears the same in Notification bar while downloading
request.setDescription("Description for the DownloadManager Bar");
request.setTitle("YourApp.apk");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
// save the file in the "Downloads" folder of SDCARD
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "SmartPigs.apk");
// get download service and enqueue file
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
}
else if(url.endsWith(".mp3")) {
// if the link points to an .mp3 resource do something else
}
// if there is a link to anything else than .apk or .mp3 load the URL in the webview
else view.loadUrl(url);
return true;
}
});
在上面的代码中,我管理.apk文件,.mp3文件的链接,所有其他链接将由webview处理(普通HTML页面)
答案 1 :(得分:1)
我认为webview将仅下载并呈现text / html内容和multiparts。其余的将被导向您正在看的下载客户端。