Как реализовать мою собственную схему URI на Android

Скажем, я хочу определить этот URI, например:

myapp://path/to/what/i/want?d=This%20is%20a%20test

должен обрабатываться моим собственным приложением или службой. Обратите внимание, что это схема "myapp", а не "http" или "ftp". Это именно то, что я намереваюсь: определить мою собственную схему URI глобально для ОС Android. Это возможно?

Это в некоторой степени аналогично тому, что уже делают некоторые программы, например, в системах Windows, таких как Skype (skype://) или любая программа-загрузчик торрентов (torrent://).


person punnie    schedule 15.03.2010    source источник


Ответы (5)


Это очень возможно; вы определяете схему URI в своем AndroidManifest.xml, используя _1 _ элемент. Вы устанавливаете фильтр намерений с заполненным элементом <data>, и вы сможете создать свою собственную схему. (Подробнее о фильтрах намерений и разрешении намерений см. здесь.)

Вот небольшой пример:

<activity android:name=".MyUriActivity">
    <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="myapp" android:host="path" />
    </intent-filter>
</activity>

Что касается того, как работают неявные намерения, вам необходимо определить как минимум одно действие и одну категорию; здесь я выбрал ПРОСМОТР в качестве действия (хотя это может быть что угодно) и обязательно добавил категорию ПО УМОЛЧАНИЮ (поскольку это требуется для всех неявных намерений). Также обратите внимание, как я добавил категорию BROWSABLE - в этом нет необходимости, но это позволит открывать ваши URI из браузера (отличная функция).

person Dan Lew    schedule 15.03.2010
comment
Мне потребовалось время, чтобы понять, что для ссылки на конкретный путь в переменной android: path необходимо указать все, что находится после протокола, т. Е. он должен иметь вид youtube.com/myvideo - person Casebash; 14.05.2010
comment
Отлично работает, но как я могу прочитать значение параметра GET d, указанное в URL-адресе из MyUriActivity? - person Timo Ernst; 12.06.2013
comment
у меня не работает У меня есть несколько фильтров Intent для одного и того же действия. Один для основной пусковой установки. второй - для открытия определенного файла; третий - как указано выше. Первые два работают отлично, а третий - нет. - person mohitum; 21.07.2014
comment
не могли бы вы взглянуть на вопрос здесь stackoverflow.com/q/29116574/3828908 - person Salmaan; 27.03.2015
comment
англоязычная версия указанной выше ссылки на случай, если кому-то понадобится Это. - person Zensaburou; 01.12.2015
comment
Это не сработает, если отправить URI, например ‹a href=myApp://path› здесь ‹/a› (путь - любое полностью сформированное com.app.packagename), используя GMAIL. GMAIL получает ссылку в теле сообщения, но не распознает ее как ссылку. В том же электронном письме, полученном в MS Outlook, будет отображаться ссылка, и при нажатии попытайтесь открыть приложение. Я застрял при попытке отправить по электронной почте ссылку на свой телефон со встроенной ссылкой, чтобы открыть мое приложение. - person bob; 07.05.2017
comment
@Daniel Я передаю URL-адрес, подобный этому iptv2://cityofworks.com/1510126973.m3u, но файл недоступен, пока у меня есть фильтр намерений в файле здесь 1drv .ms / u / s! AmLTh4MRccdmimQx6rkwCz7MzS7e - person Muhammad Muazzam; 10.11.2017
comment
Мне пришлось удалить android: host = path, чтобы он заработал. Теперь он работает с Gmail. - person Hashim Akhtar; 15.02.2019

Дополняя @DanielLew ответ, чтобы получить значения параметров, вы должны сделать это:

Пример URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

в вашей деятельности:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}
person Diego Palomar    schedule 17.01.2015
comment
а если ссылка похожа на http://www.host.com/directory/value? Как мы можем получить это value? - person Bugs Happen; 05.11.2015
comment
Неважно, получил SO-ответ здесь. - person Bugs Happen; 05.11.2015
comment
Как читать теги данных в AndroidManifest.xml в коде без использования метаданных. Мне это нужно, чтобы отправить точную схему, путь и хост на сервер также в вызове oauth. Не хочу дублировать декларацию обратного звонка! - person Pradeep Chakravarti Gudipati; 30.03.2017
comment
@BugsHappen это последний сегмент пути URI. Используйте 1_ - person Martin; 16.06.2018

Я настоятельно рекомендую вам не определять свою собственную схему. Это противоречит веб-стандартам для схем URI, которые пытаются жестко контролировать эти имена по уважительной причине - чтобы избежать конфликтов имен между различными объектами. Как только вы разместите ссылку на свою схему на веб-сайте, вы поместите это маленькое имя во все пространство имен Интернета и должны следовать этим стандартам.

Если вы просто хотите иметь ссылку на свое собственное приложение, я рекомендую вам следовать подходу, который я описал здесь:

Как зарегистрировать некоторое пространство имен URL-адресов (myapp: //app.start/) для доступа к вашей программе путем вызова URL-адреса в браузере в ОС Android?

person hackbod    schedule 15.03.2010
comment
Спасибо за внимание, но я буду использовать это только, чтобы попытаться доказать концепцию в закрытой среде. Если этот эксперимент когда-нибудь выйдет из фазы тестирования, я обязательно подумаю о ратификации всей сделки. - person punnie; 16.03.2010
comment
Хорошо ... но почему бы просто не поступить правильно? Это не большая работа. - person hackbod; 16.03.2010
comment
Youtube делает то, что предлагает @hackbod, но открытие ссылок Youtube из facebook открывает браузер, а не приложение Youtube. Этот механизм слишком хрупкий? - person AlikElzin-kilaka; 04.04.2012
comment
Я склоняюсь к определению моей собственной схемы, чтобы я мог использовать одну и ту же веб-логику для запуска либо моего приложения iOS, либо приложения Android. Только мои 2 цента - person Chicowitz; 11.10.2013
comment
@hackbod Я не думаю, что они имели в виду android, когда писали это rfc. Хотя я на 100% согласен с тем, что нет необходимости в создании новой схемы, я думаю, что причина именно в этом: в том, что даже не нужно достигать цели. А теперь ... когда вы похожи на facebook, whatsapp или другие крупные, устоявшиеся инструменты tec - правило не создавать новую схему URI к вам, конечно же, больше не относится. Если ваше имя уже привязано к компании в глобальном масштабе, конфликтов в названиях схем не будет. - person icyerasor; 03.10.2018

Другой альтернативный подход Диего - использовать библиотеку:

https://github.com/airbnb/DeepLinkDispatch

Вы можете легко объявить URI, которые вы хотите обрабатывать, и параметры, которые вы хотите извлечь, с помощью аннотаций в Activity, например:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

В качестве плюса, параметры запроса также будут переданы в Activity.

person Christian    schedule 02.07.2015

Поскольку вопрос задан много лет назад, и Android сильно эволюционировал в этой схеме URI.
От исходной схемы URI до прямых ссылок, а теперь и ссылок на приложения Android.

Android теперь рекомендует использовать URL-адреса HTTP, а не определять собственную схему URI. Поскольку ссылки на приложения Android используют URL-адреса HTTP, которые ссылаются на домен вашего веб-сайта, никакое другое приложение не может использовать ваши ссылки. Вы можете проверить сравнение ссылок на контент и ссылок на приложения Android здесь

Теперь вы можете легко добавить схему URI, используя опцию Android Studio: Инструменты> Помощник по ссылкам на приложения. Подробную информацию см. В документе Android: https://developer.android.com/studio/write/app-link-indexing.html.

person Weidian Huang    schedule 07.06.2019