我的应用程序中有一个WebView,其中一些站点被打开(总是相同的,它是我自己的页面)。该站点有一些JS代码,可以从远程主机加载一些图像。
我想拦截对这些图像的请求(通过URL模式)并回馈我自己的内容(即另一个图像),或者根据内部应用程序逻辑保持请求不变。
有可能吗?
编辑:当前的问题状态......
WebView
能够设置WebViewClient
(如Axarydax所述)。 WebViewClient
有两种有用的方法
shouldOverrideUrlLoading
onLoadResource
shouldOverrideUrlLoading
能够拦截任何网址加载,如果加载是由页面交互触发的(即单击页面上的链接,则WebView.loadURL(“”)不会触发此方法)。它还可以通过返回false来取消URL加载。这种方法不可用,导致'它无法拦截页面资源的加载(和图像,我需要拦截,是这样的页面资源)。
onLoadResource
,但是没有办法取消它。这使得这种方法也不适合我的任务。
答案 0 :(得分:68)
试试这个,我在类似个人维基的应用程序中使用它:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("foo://")) {
// magic
return true;
}
return false;
}
});
答案 1 :(得分:48)
看起来API级别11支持您所需的内容。请参阅WebViewClient.shouldInterceptRequest()
。
答案 2 :(得分:10)
据我所知,shouldOverrideUrlLoading不是为图像调用而是为超链接调用...我认为适当的方法是
@Override
public void onLoadResource(WebView view, String url)
对于webview加载的每个资源(图像,样式表,脚本)调用此方法,但由于它是一个空白,我没有找到更改该URL并替换它以便加载本地资源的方法...
答案 3 :(得分:9)
这是我用于我的应用的解决方案。
我有几个带有css / js / img anf字体文件的资产文件夹。
应用程序获取所有文件名,并查看是否请求具有此名称的文件。如果是,则从资产文件夹加载它。
//get list of files of specific asset folder
private ArrayList listAssetFiles(String path) {
List myArrayList = new ArrayList();
String [] list;
try {
list = getAssets().list(path);
for(String f1 : list){
myArrayList.add(f1);
}
} catch (IOException e) {
e.printStackTrace();
}
return (ArrayList) myArrayList;
}
//get mime type by url
public String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {
if (extension.equals("js")) {
return "text/javascript";
}
else if (extension.equals("woff")) {
return "application/font-woff";
}
else if (extension.equals("woff2")) {
return "application/font-woff2";
}
else if (extension.equals("ttf")) {
return "application/x-font-ttf";
}
else if (extension.equals("eot")) {
return "application/vnd.ms-fontobject";
}
else if (extension.equals("svg")) {
return "image/svg+xml";
}
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;
}
//return webresourceresponse
public WebResourceResponse loadFilesFromAssetFolder (String folder, String url) {
List myArrayList = listAssetFiles(folder);
for (Object str : myArrayList) {
if (url.contains((CharSequence) str)) {
try {
Log.i(TAG2, "File:" + str);
Log.i(TAG2, "MIME:" + getMimeType(url));
return new WebResourceResponse(getMimeType(url), "UTF-8", getAssets().open(String.valueOf(folder+"/" + str)));
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
//@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@SuppressLint("NewApi")
@Override
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
//Log.i(TAG2, "SHOULD OVERRIDE INIT");
//String url = webResourceRequest.getUrl().toString();
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
//I have some folders for files with the same extension
if (extension.equals("css") || extension.equals("js") || extension.equals("img")) {
return loadFilesFromAssetFolder(extension, url);
}
//more possible extensions for font folder
if (extension.equals("woff") || extension.equals("woff2") || extension.equals("ttf") || extension.equals("svg") || extension.equals("eot")) {
return loadFilesFromAssetFolder("font", url);
}
return null;
}
答案 4 :(得分:4)
您没有提及API版本,但自API 11以来,方法WebViewClient.shouldInterceptRequest
也许这会有所帮助?
答案 5 :(得分:3)
最终的解决方案是在环回上嵌入一个简单的http服务器监听你的“秘密”端口。然后,您可以使用http://localhost:123/.../mypic.jpg
等替换匹配的图像src URL答案 6 :(得分:2)
这可能会有所帮助:
SELECT * FROM (SELECT * FROM `ContentDetails ` ORDER BY `contentid ` ASC ) AS a GROUP BY `contentType` limit 0,100;