OAuth и пользовательская схема приводят к "ERR_UNKNOWN_URL_SCHEME" в Chrome

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

Хорошо. Таким образом, у меня есть активность LoginScreen с кнопкой, запускающей новый Intent.ACTION_VIEW при щелчке. Это запустит процесс OAUTH в браузере с ApiManager.OAUTH_CALLBACK_URI, установленным на stjapp://oauthresponse.

Здесь моя часть AndroidManifest.xml для этой операции:

<activity
    android:name=".LoginScreen"
    android:label="@string/application"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="stjapp" android:host="oauthresponse" />
    </intent-filter>
</activity>

Как я начинаю Intent.ACTION_VIEW в своей деятельности:

private View.OnClickListener loginHandler = new View.OnClickListener() {
        public void onClick(View v) {
             OAuthClientRequest request = null;
             try {
                request = OAuthClientRequest
                    .authorizationLocation(ApiManager.OAUTH_AUTHORIZE)
                    .setClientId(ApiManager.CLIENT_ID).setRedirectURI(ApiManager.OAUTH_CALLBACK_URI)
                    .buildQueryMessage();
            } 
            catch (OAuthSystemException e) { e.printStackTrace(); } 
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(request.getLocationUri() + "&response_type=code"));
            startActivity(intent);
        }
    };

И вот скриншот того, что происходит в браузере:

enter image description here

Там я должен вернуться к своей работе LoginScreen и обрабатывать параметры запроса code в методе onNewIntent, но... да, вещь больше не работает так, как ожидалось.

Любая помощь была оценена.

Ответ 1

Похоже, это Chromium bug. Обходной путь, который я использую, - это целевая страница PHP для RedirectURI, которая открывает приложение через JavaScript (на который не влияет эта ошибка):

<script language="javascript">
    window.location = 'myscheme://myhost/?<?=$_SERVER["QUERY_STRING"]?>';
</script>

Ответ 2

Я имел ту же ошибку и разрешил ее, префикс url с помощью http://.

Ответ 3

В Chrome версии 40 и выше эта ошибка появилась снова, но только если вы вручную вводите URL-адрес страницы переадресации в адресной строке. Проблема заключается в отслеживании хрома здесь.

Ответ с "обходным путем", вставленный из проблемы:

ОК, я выяснил, что перенаправление окна .location через намерение будет work, AS LONG, поскольку он щелкнут по внешнему источнику или ссылке на стр. Если вы вручную вводите адрес страницы перенаправления в адресной строке, перенаправление/открытие приложения не будет выполнено с указанным ошибка.

Таким образом, отправка ссылки на страницу перенаправления по электронной почте или SMS будет работать просто отлично, когда пользователь нажимает на ссылку. Вручную введите адрес в адресную строку не удастся. window.location = chromeUrl; должен работать просто отлично.

Ответ 4

только если вы вручную вводите URL-адрес страницы переадресации в адресной строке. Проблема заключается в отслеживании хромовой проблемы здесь.

Ответ с "обходным путем", вставленный из проблемы:

Хорошо, я выяснил, что перенаправление window.location через намерение будет работать, AS LONG, поскольку оно нажимается на внешний источник или ссылку на странице. Если вы вручную вводите адрес страницы перенаправления в адресную строку, перенаправление/открытие приложения завершится с ошибкой.

Таким образом, отправка ссылки на страницу переадресации по электронной почте или SMS будет очень удобной, если пользователь нажмет на ссылку. Вручную ввести адрес в адресную строку не удастся. window.location = chromeUrl; должен работать нормально.