Intereting Posts
Android: невозможно выполнить операцию / ClassNotFoundException Где я могу получить драйвер Radio с открытым исходным кодом и RIL для телефона Android? Gson deserialization List <String> в realmList <RealmString> Android: Валюта российского рубля не отображается на определенном телефоне? Как создать стиль Android с вкладками с просмотром страниц Swipe Источник Android Android SDK не будет компилироваться с помощью Eclipse Indigo Изменение фонового изображения Android с изменением в / из анимации MSISDN: Это данные SIM-карты? Почему все предоставленные функции (от Blackberry и Android) для получения MSISDN не надежны? Android: rebuild теперь требует уровня соответствия компилятора 5.0 или 6.0. Вместо этого найдено «1.7». Зачем удалять @Override? Веб-просмотр не загружается в первый раз Лучшая практика для viewflipper, содержащей 10 линейных выходов? Как отключить сканирование для модели в Activeandroid Android: фильтрация SimpleCursorAdapter ListView Как получить чтение файла по строкам Как синхронизировать контакты телефона в gmail в android программно с помощью google-контактов api

Android Webview Javascript – ссылки на скрипты не работают

Разработка на Android Studio 1.0.1, API 21. Ниже приведена структура папок – Введите описание изображения здесь

Это, по сути, приложение на основе AngularJS, которое я хочу обернуть внутри контейнера webview и запустить на Android.

Моя сторона Android-кода –

WebView myWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); myWebView.setWebChromeClient(new WebChromeClient()); String filePath = "file:///android_asset/www/index.html"; myWebView.loadUrl(filePath); 

Ссылки в html являются относительными –

 <script src="lib/jquery.min.js"></script> <script src="lib/angular.min.js"></script> <script src="lib/angular-route.min.js"></script> <script src="lib/bootstrap.min.js"></script> 

Но, что интересно, я обыскал большинство мест, и я не уверен, где я ошибаюсь. Мои ссылки не работают вообще! Поэтому я не могу получить доступ к моим файлам lib, моим скриптам, моим css. Кроме того, если я запускаю внешнюю угловую веб-страницу внутри webview, с тем же кодом Java, она работает отлично!

Любая помощь приветствуется.

Примечание. Пожалуйста, не предлагайте использовать Cordova / PhoneGap. Это требование проекта, чтобы пойти на родной язык (и я откровенно не понимаю, почему, но я только разработчик, который в этом не говорит).

На стороне примечание: я столкнулся с той же проблемой с веб-просмотром iOS. Ссылки не работают!


ОБНОВИТЬ

Пробовал следующие вещи:

Пробовал loadDataWithBaseURL() , не работает.

Пробовал все возможные сценарии для путей. Ничего не получилось.

Удалены все сценарии из папки и помещены на корневой уровень, а измененные ссылки не имеют путей, просто имена файлов. Все еще не работает. И это слишком странно.

Solutions Collecting From Web of "Android Webview Javascript – ссылки на скрипты не работают"

Мне удалось сделать что-то подобное следующим образом:

 WebView webView = (WebView) findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webView.setWebChromeClient(new WebChromeClient()); try { String html = readAssetFile("www/index.html"); webView.loadDataWithBaseURL("file:///android_asset/www/", html, "text/html", "UTF-8", null); } catch (IOException e) { } 

Где «readAssetFile»:

 private String readAssetFile(String fileName) throws IOException { StringBuilder buffer = new StringBuilder(); InputStream fileInputStream = getAssets().open(fileName); BufferedReader bufferReader = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8")); String str; while ((str=bufferReader.readLine()) != null) { buffer.append(str); } fileInputStream.close(); return buffer.toString(); } 

Кроме того, моя страница простая: просто проверить изображение, angularjs lib и таблицу стилей css:

 <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="css/mystyle.css"> <script src="libs/angular.min.js"></script> </head> <body> <img src="images/IMG_7765.JPG" alt="De nada" width="200" height="300"> <div ng-app=""> <p>Input something in the input box:</p> <p>Name: <input type="text" ng-model="name" value="John"></p> <p ng-bind="name"></p> </div> </body> </html> 

Кроме того, моя файловая структура следующая

Введите описание изображения здесь

Надеюсь, поможет 🙂

Попробуйте поставить переднюю панель перед «lib» на пути ваших источников, подобных этому (так как это относительный вызов, браузер завершит его для вас http: //domain/lib/jquery.min.js вместо http: / /domain.comlib/jquery.min.js ).

ОБНОВЛЕНИЕ – я считаю, что AngularJS использует директиву ng-src для включения внешних источников:

 <script ng-src="/lib/jquery.min.js"></script> <script ng-src="/lib/angular.min.js"></script> <script ng-src="/lib/angular-route.min.js"></script> <script ng-src="/lib/bootstrap.min.js"></script> 

В качестве альтернативы вы также можете завершить путь самостоятельно, если вам действительно не нужен такой динамический код (это также быстрый тест, чтобы убедиться, что все на самом деле работает):

 <script ng-src="http://domain.com/lib/jquery.min.js"></script> <script ng-src="http://domain.com/lib/angular.min.js"></script> <script ng-src="http://domain.com/lib/angular-route.min.js"></script> <script ng-src="http://domain.com/lib/bootstrap.min.js"></script> 

Я не пробовал это, но поставил вашу страницу index.html в строку и передал ее как данные. BaseUrl – это http://domain.com

 public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl) 

Webview с ресурсами как локального, так и межсетевого (Интернета и интрасети). Вы должны использовать loadDataWithBaseURL, и все ресурсы interweb должны быть http: // или весь доступ к файлу должен быть файлом: // ресурсы в любом месте из Интернета также должны быть указаны с помощью http: //, который является Ссылки и т. Д. Во всем, что приходит из Интернета, не может быть //i/image.jpg они должны быть http://www.example.com/i/image.jpg . Это веб-или файловая система должна быть полностью квалифицирована.

Ниже я использую локальный каталог в файловой системе, передавая полный путь к файлу (он работает, чтобы получить каталог). Html помещается в строку. Поскольку я использую loadDataWithBaseURL, я также могу получить доступ к interweb, когда он имеет префикс http: //

 StringBuilder sb = new StringBuilder(); sb.append("<html><body><div style=\"width:100%; text-align:center; font-size:large;\">"); sb.append(kmlmo.markeroptions.getTitle()); sb.append("</div>"); sb.append("<a href = \"http://www.example.com/link.html\">mylink</a>"); sb.append(kmlmo.markeroptions.getSnippet()); sb.append("</body></html>"); View v = getView(); if (v != null) { wv = (WebView) v.findViewById(R.id.webView1); if (wv != null) { String localPath = "file://" + kmlmo.path; String temp = sb.toString(); wv.loadDataWithBaseURL(localPath, temp, "text/html", "UTF-8", ""); } 

После того, как многие из насмехались и много помогали людям, которые ответили, виновником в моем коде был base тег. Я удалил его, а также удалил html5mode вещь. Итак, чтобы подвести итог, я удалил следующее:

  <base href="/"> 

а также

 $locationProvider.html5Mode(true); 

И все приступило к работе.