Перенаправление URL не работает в Android через Intent - (Ошибка страницы не найдена)
У меня есть этот код:
Button bluehost = (Button)findViewById(R.id.bluehost);
bluehost.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
Intent browserIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.bluehost.com/track/businessplan/"));
startActivity(browserIntent);
}
});
Технически этот код работает, чтобы отправить человека на этот URL-адрес, но по какой-то причине этот конкретный URL-адрес переходит на страницу, не найденную из этого кода, но отображает, если вы поместите этот URL-адрес в браузер. Но когда это делается из приложения, он переходит на страницу не найден. Я тестирую браузер Android Safari.
Это из-за перенаправления по URL-адресу? И как я могу это исправить?
У меня есть эта строка в файле манифеста:
<uses-permission android:name="android.permission.INTERNET" />
ПРИМЕЧАНИЕ:
Интернет-соединение НЕ является проблемой. Этот код работает для других URL-адресов. Это что-то странное, что происходит с этой конкретной ссылкой.
Спасибо!
Ответы
Ответ 1
Код в моем ответе ниже и соответствующая перенаправление работали для меня.
На моем Xperia Z Ultra это выглядит так:
![N9WW1.png]()
Согласно официальной документации для обоих. И когда я еще пробовал это на своем XPRT с помощью браузера, но вручную ввел URL-адрес, я получил диалоговое окно "Невозможно установить безопасное соединение". К сожалению, удаление "s" в https тоже не работает, поскольку оно перенаправляется на защищенную версию, и я все равно получаю сообщение "Безопасное соединение не может быть установлено".
Ранее ответ:
Если вы точно следуете этому Chrome WebView учебник. Вы доберетесь до этой части. Акцент в жирный - мой.
Обработка навигации
Теперь попробуйте изменить URL-адрес, который вы загружаете http://www.html5rocks.com/ и повторите попытку. Вы заметите что-то странное.
Если вы запустили приложение сейчас с сайта, на котором есть перенаправление, например html5rocks.com, ваше приложение заканчивает открытие сайта в браузере на устройство, а не в вашем WebView - вероятно, не то, что вы ожидали. Это из-за того, как WebView обрабатывает события навигации.
Здесь последовательность событий:
-
WebView пытается загрузить исходный URL-адрес с удаленного сервера и получает перенаправление на новый URL-адрес.
-
WebView проверяет, может ли система обрабатывать намерение представления для URL-адреса, если система обрабатывает URL-адрес навигации, в противном случае WebView будет перемещаться внутри системы (то есть у пользователя нет браузера, установленного на их устройстве).
-
Система выбирает предпочтительное приложение для работы с URL-схемой http://- то есть пользовательский браузер по умолчанию. Если у вас несколько браузеров вы можете увидеть диалог на этом этапе.
Другими словами, если вы просто остановите учебник на этом этапе, вы получите желаемое поведение.
Вот фактический код в случае, если ссылка перестает работать:
MainActivity.java
public class MainActivity extends Activity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.activity_main_webview);
mWebView.loadUrl("https://www.bluehost.com/track/businessplan/");
}
@Override
public void onBackPressed() {
if(mWebView.canGoBack()) {
mWebView.goBack();
} else {
super.onBackPressed();
}
}
}
activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
tools:ignore="MergeRootFrame">
<WebView
android:id="@+id/activity_main_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
Также для тех, кто читает это, я не упоминаю необходимое разрешение ИНТЕРНЕТ в манифесте, потому что у оригинального человека уже есть эта часть.
Ответ 2
Если вы обнаружили ошибку страницы в браузере Android Safari, вы можете открыть ссылку в браузере Chrome, которую многие устройства имеют или предоставляют пользователю возможность выбрать приложение браузера, которое откроет ссылку в выбранном браузере.
Чтобы открыть ссылку в браузере google chrome, вы должны проверить, установлена ли она на устройстве. для этого вы можете использовать этот метод, чтобы проверить, установлен ли Chrome-браузер или нет.
private boolean isPackageInstalled(String packagename, Context context) {
PackageManager pm = context.getPackageManager();
try {
pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
имя пакета chrome-браузера com.android.chrome
. вы должны установить это как имя пакета, используя browserIntent.setPackage("com.android.chrome");
Для отображения параметров для пользователя, которое вы можете выбрать, вы можете создать следующее:
Intent chooserIntent = Intent.createChooser(browserIntent, "Select Application");
startActivity(chooserIntent);
Вот ваш окончательный код:
Intent browserIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://www.bluehost.com/track/businessplan/"));
boolean isChromeInstalled = isPackageInstalled("com.android.chrome", YourActivityName.this);
if (isChromeInstalled) {
browserIntent.setPackage("com.android.chrome");
startActivity(browserIntent);
}else{
Intent chooserIntent = Intent.createChooser(browserIntent, "Select Application");
startActivity(chooserIntent);
}
Но обратите внимание, что если вы дадите опцию выбора приложения браузера, то также отображается браузер Safari.
или у вас также есть возможность использовать Webview
, как ответил Stephan Branczyk
Надеюсь, это поможет вам.
Ответ 3
В браузерах есть определенные ошибки.
Поддержка SPDY и HTTP/2 ограничена некоторыми современными версиями Браузеры Google Chrome, Opera, Firefox, Safari и Internet Explorer. Для получения более подробной информации просмотрите http://caniuse.com/spdyдля браузеров SPDY и http://caniuse.com/http2 для какие браузеры поддерживают HTTP/2.
Все браузеры поддерживают только SPDY и HTTP/2 через соединение TLS. Поэтому HTTPS следует использовать для использования SPDY или HTTP/2.
Когда я попробую ссылку в браузере Chrome, он говорит: "Веб-страница недоступна". Но когда я пытаюсь сделать то же самое в браузере Opera, он открывается.
В браузере Chrome говорится: "ERR_SPDY_PROTOCOL_ERROR". пока я серфинг в Интернете он говорит, что это ошибка в браузере Chrome сам. Одним из возможных решений является попытка обходного решения упомянутая в этой ссылке ссылка
-
Попробуйте обновить браузеры, доступные на вашем мобильном телефоне, до последней версии.
-
Фактический сайт может быть недоступен для обслуживания.
-
Если вы установили приложение Avast на свой мобильный телефон, попробуйте добавить ссылку
-
Сессии SPDY в Chrome можно проверить через URI: chrome://net-internals/# events & q = type: SPDY_SESSION %20is: active.
Вы можете найти что-то вроде этого:
SPDY Enabled: true
Использовать альтернативный протокол: true
Force SPDY Always: false
Сила SPDY Over SSL: true
Следующие протоколы: http/1.1, spdy/2, spdy/3
Если вы просто установите для параметра "SPDY Enabled" значение false, проблема будет решена, так как после этого HTTP будет использоваться для веб-общения.
- Иногда avast может также вызвать проблему, если вы установили приложение avast на свой мобильный телефон. Перейдите в "Настройки" > "Активная защита" > "Настроить веб-экран" > "Исключения" > "Добавить ссылку" здесь.
Надеюсь, это может помочь вам.. в каком-то случае!!. Извините за мой плохой английский.
Источник, собранный в Интернете.
Ответ 4
ваш код откроет url в браузере устройства, если перенаправление не работает, определенно проблема не в вашем коде. это может быть связано с тем, что перенаправление на веб-сайте не работает или используемый вами браузер не может выполнить это перенаправление. в вашем случае, я думаю, браузер, который вы используете, не может выполнить перенаправление.
Ответ 5
Use this
Uri uri = Uri.parse( " https://www.bluehost.com/track/businessplan/" ); startActivity (Intent.createChooser(новый Intent (Intent.ACTION_VIEW, uri), "Выбрать браузер" ));