Загрузка пользовательского URL-адреса в веб-просмотре

В моем приложении я загружаю URL-адрес «http» в веб-просмотре. Этот URL-адрес загружается правильно, но некоторые внутренние URL-адреса загружаются с протоколом «sheet://». При загрузке этого URL-адреса я получаю сообщение об ошибке «протокол не поддерживается». Может ли кто-нибудь помочь, как это исправить? Как загрузить URL-адреса с протоколом «лист: //»?

PS: я использую метод shouldOverrideUrlLoading для загрузки URL-адреса.

Это код, который я использую

 public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if(url.contains("sheet://")){
          Intent url_intent = new Intent ( Intent.ACTION_VIEW,Uri.parse(url));
          url_intent.addCategory(Intent.CATEGORY_BROWSABLE);
          startActivity(url_intent);
          return false; 
        }else{
              view.loadUrl(url);
              return true; 
        }
 }

С уважением,


person VijayRaj    schedule 06.03.2014    source источник
comment
Вы пытались открыть этот URL-адрес в настольном браузере?   -  person Spring Breaker    schedule 06.03.2014
comment
да, я пробовал, и это работает в настольном браузере   -  person VijayRaj    schedule 06.03.2014
comment
Посмотрите здесь. Это может помочь.   -  person MysticMagicϡ    schedule 06.03.2014
comment
Можете ли вы поделиться одним таким URL?   -  person Spring Breaker    schedule 06.03.2014
comment
@MysticMagic Я уже видел этот пост, но он все еще не работает   -  person VijayRaj    schedule 06.03.2014
comment
@SpringBreaker Извините, этот URL будет работать только во внутренней сети.   -  person VijayRaj    schedule 06.03.2014


Ответы (3)


Возможно, разместить файл PHP с заголовком?

<?php
header("Location: sheet://link_to_your_file.extention");
?>
person Laurens    schedule 06.03.2014
comment
ссылка на файл имеет протокол http, но внутри использует протокол sheet:// - person VijayRaj; 06.03.2014

Видите ли вы вызов shouldOverrideUrlLoading для ввода URL-адреса вашего листа://? Эта часть кода выглядит правильно (при условии, что на вашем устройстве установлено приложение, которое может обрабатывать намерения sheet:// BROWSABLE). Или вы имеете в виду, что приложение, запущенное из вашего приложения, не может загрузить URL-адрес листа: //? Какое приложение запускается для ответа на Intent?

У вас есть одна ошибка — это вызов loadUrl, когда лист:// нет в URL-адресе. В этом случае, пожалуйста, просто return true. Загрузка URL-адреса уже выполняется, нет необходимости запускать ее снова. Это фактически создает петлю.

person ksasq    schedule 06.03.2014
comment
На моем устройстве не установлено какое-либо другое приложение. Я пытаюсь загрузить URL-адрес листа: // в свое приложение. Я удалил часть Intent из кода и просто вернул false для листа: / /url, но получаю, что протокол не поддерживается - person VijayRaj; 07.03.2014
comment
Тогда это ожидаемо. Если на устройстве нет ничего для обработки вашей пользовательской схемы, то как она может поддерживаться? Что вы ожидаете загрузить для URL-адресов листа? Вы хотите вместо этого использовать API shouldInterceptRequest, который позволяет вам предоставлять свой собственный InputStream в ответ на запрос? - person ksasq; 07.03.2014
comment
У меня это работает :) Я хочу знать, как получить возвращаемое значение, когда я загружаю функцию javascript внутри веб-просмотра? - person VijayRaj; 27.03.2014
comment
Рад слышать, что это работает, какое решение было в конце концов? Для JavaScript нет способа сделать это синхронно. В Android 4.4 вы можете использовать WebView.evaluateJavascript и передать обратный вызов, который будет работать с результатом, до версии 4.4 вам потребуется комбинация loadUrl(javascript:) и addJavaScriptInterface для получения результата. - person ksasq; 27.03.2014
comment
URL-адрес протокола листа не предназначен для загрузки. Я пытался загрузить его и, следовательно, получил эту ошибку. Что касается javascript, если я использую addJavaScriptInterface, мне нужно изменить код в моем файле js.... используют тот же код js для ios, есть ли другой способ получить ответ? - person VijayRaj; 27.03.2014
comment
единственное, что я могу придумать, это чтобы javascript, который вы вызываете в loadUrl, вызывал обратно ваше приложение с результатом через диалоговое окно alert() (вы можете перехватывать диалоговые окна предупреждений с помощью WebChromeClient.onJsAlert). WebView.loadUrl (javascript: предупреждение (foo ());) - person ksasq; 27.03.2014
comment
Я пробовал это... но функция в предупреждении не выполняется :( Вот как я ее использую webview.loadUrl("javascript:alert(functionToExecute(arg0,arg1));") - person VijayRaj; 27.03.2014
comment
Когда ты это делаешь? Полностью ли загружена страница, так что функция functionToExecute() определена? Любые сообщения в logcat? Если вы просто сделаете предупреждение (тест), пройдет ли оно через ваше приложение? - person ksasq; 28.03.2014

Вы должны зарегистрировать действие с помощью фильтра намерений, который соответствует этому протоколу в вашем AndroidManifest.xml.

person Fernando Gallego    schedule 16.01.2015