Хост схемы не работает на Android Lollipop, щелкните ссылку, чтобы открыть приложение

Я использую этот фрагмент кода для запуска своего приложения по ссылке.

<activity
        android:name="com.example.myApp.myClass"
        android:label="@string/app_name" >
    <intent-filter>
        <data
            android:host="customHostName"
            android:scheme="customScheme" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>  

Это href ссылка, я хочу получить в конце концов ключ.

customScheme://customHost/49FYTJTF00

Он отлично работает на всех предыдущих версиях Android, но не работает на Lollipop.
Когда я нажимаю ссылку, отображается только список браузеров для запуска.

Что я должен делать?


person Salmaan    schedule 18.03.2015    source источник
comment
Не могли бы вы поделиться своим URL? укажите путь префикса .. попробуйте также изменить sdk 21   -  person Ahmad Arslan    schedule 13.04.2015


Ответы (5)


Используйте префикс пути.

   android:pathPrefix="/"

Это может решить вашу проблему. Следуйте URL-адресу Android-разработчика.

person Ahmad Arslan    schedule 13.04.2015

Редактировать:

После тестирования и тестирования я обнаружил, что если ваша схема содержит символ верхнего регистра, браузер не сможет ее запустить. Ваша схема должна содержать только строчные буквы!

Также обратите внимание, что ошибка 459156 проекта Chrome по-прежнему не позволяет вам запускать URL-адреса напрямую, вы должны ссылаться на веб-страницу, содержащую этот код JavaScript:

<!DOCTYPE html>
<html>
    <body>
        <script language="javascript">
            window.location = 'customscheme://customHost/49FYTJTF00';
        </script>
    </body>
</html>

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

Чтобы попробовать, откройте браузер Android, перейдите по указанному ниже URL-адресу и скопируйте и вставьте приведенный выше фрагмент в редактор: http://www.w3schools.com/html/tryit.asp?filename=tryhtml_intro

Gif, показывающий браузер + JavaScript, открывающий действие

Gif

Исходный пост

Я опробовал ваш пользовательский URI, и он работает на Android 5.0

Но вы должны знать о следующих двух ошибках / проблемах:

  1. Ошибка 459156 проекта Chromium Это в основном означает запуск пользовательских схем из браузер Android не будет работать, если URL-адрес не применяется с помощью JavaScript. Для обходного пути см. Это сообщение StackOverflow: OAuth и пользовательская схема приводят к ERR_UNKNOWN_URL_SCHEME в Chrome
  2. Ошибка 80971: URI с настраиваемой схемой нельзя щелкнуть в тексте SMS (Связать?)

Мой подход

Я создал два отдельных Activity, одно как приемник намерений, а другое как средство запуска намерений. У действия запуска есть EditText, в который можно ввести полный URI, и кнопку для запуска введенного URI.

Main.java onClick (запуск)

@Override
public void onClick(View view) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(input.getText().toString()));
    try {
        startActivity(intent);
    } catch(ActivityNotFoundException e){
        Toast.makeText(this, "Auww!! No Activity can open this URI!", Toast.LENGTH_SHORT).show();
    }
}

manifest.xml (только действия)

Обратите внимание на часть <data android:pathPattern=".*"/>. эта часть важна, поэтому все, что находится после хоста, будет принято как действительное.

<activity
    android:name=".Main"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

<activity
    android:name=".UriActivity"
    android:label="@string/app_name">

    <!--
    This intent-filter will open any URI with the following forms:

    customscheme://customHost/49FYTJTF00
    customscheme://customHost
    https://www.google.com/something/something
    http://www.google.com/
    http://google.com/something
    -->

    <intent-filter>
        <data android:scheme="https"/>
        <data android:scheme="http"/>
        <data android:host="google.com"/>
        <data android:host="www.google.com"/>

        <data android:scheme="customscheme"/>
        <data android:host="customHost"/>

        <data android:pathPattern=".*"/>

        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>

UriActivity.java (получение активности)

public class UriActivity extends ActionBarActivity {

    private TextView tvText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_uri);
        tvText = (TextView) findViewById(R.id.text);
        setTextFromIntent();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setTextFromIntent();
    }

    private void setTextFromIntent(){
        StringBuilder text = new StringBuilder();

        Uri data = getIntent().getData();
        if(data != null){
            text.append("Path:\n");
            text.append(data.getPath());

            text.append("\n\nScheme:\n");
            text.append(data.getScheme());

            text.append("\n\nHost:\n");
            text.append(data.getHost());

            text.append("\n\nPath segments:\n");
            text.append(Arrays.toString(data.getPathSegments().toArray()));
        } else {
            text.append("Uri is null");
        }
        tvText.setText(text);
    }
}

Снимок экрана:

Результат отправки настраиваемого намерения в UriActivity

Загрузка тестового проекта:

Я сделал загрузку для проекта, если вы не хотите попробуйте сами.

person Rolf ツ    schedule 14.04.2015
comment
Спасибо @Rolf, но он работает, когда схема http или https, но я использую настраиваемую схему ... Но если я использую http / https в качестве схемы и нажимаю ссылку из приложения электронной почты, она отображается с диалоговым окном или открывает выбранное приложение по умолчанию для запуска URL-адресов, то есть браузера. Я хочу, чтобы он открывал мое приложение. - person Salmaan; 14.04.2015
comment
@Salmaan у меня работает собственный URI (см. Снимок экрана). Вы читали отчет об ошибке браузера Chrome? Пользовательские схемы не поддерживаются, если они не загружены с помощью window.location (JavaScript). - person Rolf ツ; 14.04.2015
comment
Вы можете скачать проект, удалить части google.com и http / https и попробовать сами;) - person Rolf ツ; 14.04.2015
comment
@Salmaan Я просто попытался запустить настраиваемую схему из браузера Android 5.0 с помощью JavaScript и обнаружил, что ti не работает, однако, когда я использую схему в нижнем регистре, все работает нормально! Поэтому вам следует использовать строчную схему. - person Rolf ツ; 14.04.2015
comment
Только не забудьте про JavaScript;) Я также обновил загружаемый исходный код! - person Rolf ツ; 14.04.2015
comment
Я отправляю себе гиперссылку по электронной почте hfi: // elabelrid / 123, и я не знаю, почему все еще не сработало: /? - person Salmaan; 14.04.2015
comment
и он работал на предыдущих версиях Android: / Пробовал на 4.4 - person Salmaan; 14.04.2015
comment
И @Rolf, я открываю его из почтового приложения. - person Salmaan; 14.04.2015
comment
Подходит ли вам мой образец проекта? Вы редактировали схемы в файле manifest.xml? Примечание. Приложение электронной почты, вероятно, использует WebView для отображения содержимого почты. WebView в Android 5.0 использует Chromium webkit, из-за упомянутой ошибки щелчок по ссылке не работает. Что, если вы попытаетесь отправить ссылку на JavaScript? - person Rolf ツ; 14.04.2015
comment
Что ж, это ваша проблема, я не могу вам с этим помочь;) Или вам стоит дождаться исправления ошибки Chromium. - person Rolf ツ; 14.04.2015
comment
Я понял, что ваш предложенный метод работает в нескольких браузерах (например, дельфин, UC Browser), но не в Chrome, и ни в каких приложениях ... Никакое действие не может открыть этот URI - person Salmaan; 14.04.2015
comment
Вы можете заполнить отчет об ошибке у разработчиков Chrome. - person Rolf ツ; 14.04.2015
comment
Спасибо, Рольф. как управлять этим как пример pathPattern? id = 123 ‹data android: pathPattern = /› Я пробовал example? id = и example? id = *, но не работает! любая идея? - person Muhammad Babar; 26.05.2015

Вместо того, чтобы использовать ссылку на customScheme: // customHost / 49FYTJTF00, пробовали ли вы использовать такую ​​ссылку, как

<a href="intent://customHostName/49FYTJTF00#Intent;scheme=customScheme;end">

Chrome должен иметь возможность открыть это в вашем приложении. В то же время это может работать не во всех браузерах.

person A J    schedule 18.04.2015

Помните, что если вы хотите запустить приложение из Google Chrome, вы должны сделать это другим способом .

person klimat    schedule 19.04.2015
comment
Дело не только в Chrome, но и в любом почтовом приложении, которое есть у пользователя, или в любом браузере, который он использует. - person Salmaan; 19.04.2015
comment
@Salmaan Я не даю вам решения для всех случаев, но я почти уверен, что упомянутый подход поможет вам с Chrome. - person klimat; 19.04.2015

Вы написали:

    <data
        android:host="customHostName"
        android:scheme="customScheme" />

Итак, используйте customScheme://customHostName/49FYTJTF00
вместо customScheme://customHost/49FYTJTF00

person ytRino    schedule 17.04.2015
comment
Это просто опечатка в вопросе (в качестве примера), ОП сказал, что он работал раньше. - person Rolf ツ; 17.04.2015