DownloadListener应该如何工作?可能我想念一些东西。我做了以下事情:
以下是代码的一小部分。
package rene.android.learnit;
import android.app.*;
import android.os.Bundle;
import android.webkit.*;
public class ShowWeb extends Activity
implements DownloadListener
{
public static Lesson L;
WebView WV;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.showweb);
WV=(WebView)findViewById(R.id.showweb);
WV.setDownloadListener(this);
WV.loadUrl("http://android.rene-grothmann.de/courses.html");
}
public void onDownloadStart (String url, String agent, String disposition,
String mimetype, long size)
{
Main.log(url+" "+mimetype+" "+size);
}
}
日志记录工作(我在任何地方使用它来检查我的程序),但没有记录任何内容,因此不会调用回调。会发生什么:视图尝试下载文件,但失败了,因为我的Android不支持zip文件。
链接转到zip文件。这是通常的
<a href=...>...</a>
链接。
我试图找出注册zip文件意图的替代方法。但是文档很少,我不能这样做。如果必须,是否有例子?
有什么想法吗?
谢谢,R。
答案 0 :(得分:2)
似乎DownloadListener确实无效。但是,可以使用以下技巧:
package rene.android.learnit;
import android.app.*;
import android.os.Bundle;
import android.webkit.*;
public class ShowWeb extends Activity
{
public static Lesson L;
WebView WV;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.showweb);
WV=(WebView)findViewById(R.id.showweb);
WV.setWebViewClient(new WebViewClient()
{
public void onLoadResource (WebView view, String url)
{
Main.log(url);
if (url.endsWith(".zip"))
{
finish();
}
else super.onLoadResource(view,url);
}
}
);
WV.loadUrl("http://android.rene-grothmann.de/courses.html");
}
}
这将允许处理所有zip文件。
答案 1 :(得分:2)
它无效的原因是您将onDownloadStart
方法放在了错误的位置。
为了能够加载您在WebView
的第一个加载页面上选择的链接,您需要创建一个扩展WebViewClient
的私有类。在此课程中,您将覆盖shouldOverrideUrlLoading(WebView v, String url)
,否则内置浏览器将打开新网址。
此示例解释了:http://developer.android.com/guide/tutorials/views/hello-webview.html
然后,在onCreate()
方法集webview.setWebViewClient(new WebViewClient())
中。为了能够触发下载事件,您的WebViewClient
(您在上面的示例中创建的)会实现DownloadListener
并覆盖onDownloadStart
方法。
示例:
private class WVClient extends WebViewClient implements DownloadListener {
@Override
public boolean shouldOverrideUrlLoading(WebView v, String u) {
v.loadUrl(u);
v.setDownloadListener(this);
return true;
}
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
Log.i(TAG, "Download: " + url);
Log.i(TAG, "Length: " + contentLength);
}
}
答案 2 :(得分:0)
确保:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
if(ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {...
答案 3 :(得分:0)
尝试一下,我100%肯定会成功
public class WVClient extends WebViewClient implements DownloadListener {
private static final String TAG = "WVClient";
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
view.setDownloadListener(this);
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
Log.d(TAG, "manageDownloadsAction: URL:" + url);
Log.d(TAG, "manageDownloadsAction: UserAgent:" + userAgent);
Log.d(TAG, "manageDownloadsAction: contentDisposition:" + contentDisposition);
Log.d(TAG, "manageDownloadsAction: mimeType:" + mimetype);
Log.d(TAG, "manageDownloadsAction: contentLength:" + contentLength);
}
mWebView.setWebViewClient(new WVClient());
答案 4 :(得分:0)
启用以下 WebSettings 选项后,一切顺利。
WebSettings settings = webView.getSettings();
settings.setLoadsImagesAutomatically(true);