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


161

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

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

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

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


Ответы:


215

Это очень возможно; Вы определяете схему URI в вашем AndroidManifest.xml, используя <data>элемент. Вы устанавливаете фильтр намерений с <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>

В соответствии с тем, как работают неявные намерения, вам необходимо определить как минимум одно действие и одну категорию; здесь я выбрал VIEW в качестве действия (хотя это может быть что угодно) и добавил категорию DEFAULT (так как это требуется для всех неявных намерений). Также обратите внимание, как я добавил категорию BROWSABLE - это необязательно, но это позволит открывать ваши URI из браузера (отличная функция).


11
Мне потребовалось некоторое время, чтобы выяснить, что для ссылки на конкретный путь переменная «android: path» должна указывать все после протокола, т.е. это должно быть в форме "youtube.com/myvideo"
— Casebash

2
Прекрасно работает, но как я могу прочитать значение параметра GET "d", указанное в URL из MyUriActivity?
— Тимо

у меня не работает У меня есть несколько фильтров Intent для одной и той же деятельности. Один для основного лаунчера. второй для открытия конкретного файла третий, как указано выше Первые два работают отлично, но не третий.
— Мохитум

не могли бы вы посмотреть на этот вопрос здесь stackoverflow.com/q/29116574/3828908
— Salmaan

1
Английская версия приведенной выше ссылки на тот случай, если кому-то это понадобится.
— Zensaburou

68

В дополнение к ответу @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");
}

что если ссылка похожа http://www.host.com/directory/value? Как мы можем получить это value?
— Ошибки происходят

3
Не берите в голову, получил ТАК ответ здесь .
— Ошибки происходят

Как читать теги данных в AndroidManifest.xml в коде без использования метаданных. Мне нужно, чтобы отправить точную схему, путь и хост на сервер также в вызове oauth. Я не хочу дублировать декларацию обратного вызова!
— Прадип Чакраварти Гудипати

@BugsHappen это последний сегмент пути URI. Использованиеuri.getLastPathSegment();
— Мартин

25

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

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

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


2
Спасибо за внимание, но я буду использовать это только для того, чтобы доказать концепцию в закрытой среде. Если этот эксперимент когда-нибудь покинет фазу тестирования, я определенно рассмотрю вопрос о ратификации всей сделки.
— Пунни

5
Хорошо ... но почему бы просто не поступить правильно? Это не какая-то значительная работа.
— hackbod

2
Youtube делает то, что предлагает @hackbod, но при открытии ссылок на YouTube из Facebook открывается браузер, а не приложение Youtube. Этот механизм слишком «деликатный»?
— АликЭльзин-килака

19
Я склоняюсь к определению своей собственной схемы, чтобы я мог использовать ту же веб-логику для запуска моего приложения для iOS или моего приложения для Android. Просто мои 2 цента
— Chicowitz

1
@ Hackbod Я не думаю, что они имели в виду Android, когда они написали, что RFC. Хотя я на 100% согласен с вами, что нет необходимости создавать новую схему, я думаю, что причина именно в этом: что даже не нужно достигать цели. А теперь ... когда вы похожи на Facebook, WhatsApp или другие крупные, устоявшиеся технические инструменты - «не создавайте новую URI-схему» - правило, конечно, больше не относится к вам. Там не будет столкновения с именами схем, когда ваше имя уже связано с компанией в глобальном масштабе.
— icyerasor

6

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

https://github.com/airbnb/DeepLinkDispatch

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

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

Кроме того, параметры запроса также будут передаваться в Activity.


1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.