Я попробовал то же самое, загрузив букмарклет (код javascript в вашем вызове loadUrl ()) на стороннюю страницу.Мой букмарклет также зависит от других ресурсов (файлов javascript и css), которые не будут загружаться с файлом: /// android_asset URL.
Это потому, что контекст безопасности страницы по-прежнему равен, например, http://www.google.com, и это не разрешено доступ к файлу: URL-адреса.Вы сможете увидеть ошибки, если вы укажете / переопределите WebChromeClient.onConsoleMessage ().
В результате я получил кластер, в котором я изменил ссылки на ресурсы букмарклета на фиктивную схему URL, например:
asset:foo/bar/baz.js
и добавил переопределение WebViewClient.shouldInterceptRequest (), которое ищет и загружает их из ресурсов с помощью AssetManager.open ().
Одна вещь, которая мне не нравится в этом клудже, это то, чтоasset: схема открыта для любого стороннего HTML / Javascript на любой странице, которую мое представление загружает, предоставляя им доступ к активам моего приложения.
Одна альтернатива, которую я не пробовал, заключалась бы в вставке подпрограммы.-активизируется в букмарклет с использованием data: URL, но это может быть громоздким.
Я бы предпочел, чтобы был способ манипулировать контекстом безопасности просто букмарклетом JS IЯ загружаю в loadUrl (), но ничего подобного не могу найти.
Вот фрагмент:
import android.webkit.WebResourceResponse;
...
private final class FooViewClient extends WebViewClient
{
private final String bookmarklet;
private final String scheme;
private FooViewClient(String bookmarklet, String scheme)
{
this.bookmarklet = bookmarklet;
this.scheme = scheme;
}
@Override
public void onPageFinished(WebView view, String url)
{
view.loadUrl(bookmarklet);
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
if (url.startsWith(scheme))
try
{
return new WebResourceResponse(url.endsWith("js") ? "text/javascript" : "text/css", "utf-8",
Foo.this.getAssets().open(url.substring(scheme.length())));
}
catch (IOException e)
{
Log.e(getClass().getSimpleName(), e.getMessage(), e);
}
return null;
}
}