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

161

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

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

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

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

punnie
источник
3
Дубликат
Casebash

Ответы:

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?

hackbod
источник
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

Вейдиан Хуан
источник