Saya memiliki WebView di aplikasi saya di mana beberapa situs dibuka (selalu sama, itu adalah halaman saya sendiri). Situs ini memiliki beberapa kode JS yang memuat beberapa gambar dari remote host.
Saya ingin mencegat permintaan seperti gambar (dengan pola URL) dan memberikan kembali saya sendiri konten (yaitu gambar lain), atau permintaan cuti tersentuh tergantung pada internal logika aplikasi.
Adalah mungkin untuk melakukan itu?
EDIT: keadaan saat ini pertanyaan...
WebView
memiliki kemampuan untuk mengatur WebViewClient
(seperti dicatat oleh Axarydax). WebViewClient
memiliki dua metode yang berguna
shouldOverrideUrlLoading
onLoadResource
shouldOverrideUrlLoading
mampu mencegat setiap url loading, jika loading dipicu oleh halaman interaksi (yaitu link pada halaman diklik, WebView.loadURL("") isn't memicu metode ini). Hal ini juga dapat membatalkan URL loading dengan kembali palsu. Pendekatan ini isn't dapat digunakan, penyebab' itu tidak mampu mencegat loading dari halaman sumber (dan gambar, apa yang saya butuhkan untuk mencegat, seperti halaman sumber daya).
onLoadResource
memicu setiap kali halaman sumber (dan gambar! thx untuk jessyjones) yang memuat, tetapi tidak ada cara untuk membatalkan itu. Yang membuat metode ini tidak cocok untuk tugas saya juga.
Coba ini, saya've digunakan di wiki pribadi-seperti app:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("foo://")) {
// magic
return true;
}
return false;
}
});
Itu tampak seperti API level 11 memiliki dukungan untuk apa yang anda butuhkan. Lihat WebViewClient.shouldInterceptRequest()
.
Sejauh yang saya tahu, shouldOverrideUrlLoading tidak disebut untuk gambar melainkan untuk hyperlink... saya pikir metode yang tepat adalah
@Override public void onLoadResource(WebView lihat, String url)
Metode ini disebut untuk setiap sumber daya (gambar, styleesheet, script) yang's dimuat oleh webview, tapi sejak itu's kekosongan, saya ingin't menemukan cara untuk mengubah url tersebut dan menggantinya sehingga beban sumber daya lokal ...
Berikut adalah solusi yang saya gunakan untuk aplikasi.
Saya memiliki beberapa aset folder dengan css / js / img anf file font.
Aplikasi mendapat semua nama file dan terlihat jika sebuah file dengan nama ini yang diminta. Jika ya, itu beban dari aset folder.
//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;
}
Solusi utama akan cantumkan sederhana http server mendengarkan pada anda 'rahasia' port pada loopback. Kemudian anda dapat mengganti sesuai gambar src URL dengan sesuatu seperti http://localhost:123/.../mypic.jpg
Ini mungkin membantu:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
WebResourceResponse response = super.shouldInterceptRequest(view, request);
// load native js
if (url != null && url.contains(INJECTION_TOKEN/* scheme define */)) {
response = new WebResourceResponse(
"text/javascript",
"utf-8",
loadJsInputStream(url, JsCache.getJsFilePath(path) /* InputStream */));
}
return response;
}