Перенаправление 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 будет использоваться для веб-общения.

  1. Иногда avast может также вызвать проблему, если вы установили приложение avast на свой мобильный телефон. Перейдите в "Настройки" > "Активная защита" > "Настроить веб-экран" > "Исключения" > "Добавить ссылку" здесь.

Надеюсь, это может помочь вам.. в каком-то случае!!. Извините за мой плохой английский.

Источник, собранный в Интернете.

Ответ 4

ваш код откроет url в браузере устройства, если перенаправление не работает, определенно проблема не в вашем коде. это может быть связано с тем, что перенаправление на веб-сайте не работает или используемый вами браузер не может выполнить это перенаправление. в вашем случае, я думаю, браузер, который вы используете, не может выполнить перенаправление.