У меня есть небольшой файл CSS, который я использую с JavaScript, чтобы переопределить CSS на веб-сайте, загруженном в WebView. Я хотел бы загрузить его локально, а не получать к нему доступ в Интернете. Я заставил JavaScript работать отлично, когда файл загружается на временный файловый хост, поэтому он работает нормально, но что-то в отношении разрешений не позволяет мне использовать его в качестве актива.
Я пытался установить разрешения, изменить настройки WebView, чтобы всегда разрешать MixedContentMode, пытался использовать LoadData и т. д., но всегда возникает проблема «Не разрешено». Ресурс имеет действие сборки AndroidAsset.
string jsToInject = "javascript: var link=document.createElement('link');link.href='file:///android_asset/newsOverride.css';link.type ='text/css'; link.rel ='stylesheet';document.getElementsByTagName('head')[0].appendChild(link);";
view.LoadUrl(jsToInject);
Когда в поле link.href указан файл, размещенный где-то в Интернете, он загружает CSS, как и ожидалось. Но когда он выбран в качестве актива, он просто выбрасывает
I/chromium(11626): [INFO:CONSOLE(1)] "Not allowed to load local resource: file:///android_asset/newsOverride.css", source: (1)
Все, что мне удалось найти по ошибке, связано с Xamarin Forms, а не с Xamarin Android, любая помощь приветствуется.
Это сделало это. Он попадал в блок catch, но это было потому, что вам не нужен файл:///android_asset/ перед именем файла актива в Xamarin. Какой странный обходной путь.
Да, это странно, вы решили эту проблему? Если да, могу ли я опубликовать свой комментарий, чтобы ответить и принять его? Помогает другим искать вопросы, чтобы помочь, чтобы они не тратили время на вопросы, на которые есть ответы. Спасибо!
Да, работает как надо. Идите вперед и опубликуйте это как ответ.
Эта проблема должна реализовать WebViewClient с переопределением shouldInterceptRequest, как в этой теме.
Kitkat убивает: не разрешено загружать локальный ресурс: file:///android_asset/webkit/android-weberror.png
Фрагмент кода для Xamarin.Android, переопределяющий CSS: public override WebResourceResponse ShouldInterceptRequest(WebView view, string url) { WebResourceResponse response = base.ShouldInterceptRequest(view, url); if (url != null && url.Contains(INJECTION_TOKEN)) { string AssetPath = "newsOverride.css"; response = new WebResourceResponse("text/css", "UTF-8", context.Assets.Open(AssetPath)); } return response; }
Вы пытались реализовать WebViewClient с переопределением shouldInterceptRequest, как этот поток stackoverflow.com/questions/19997146/…